如何在 Spring MVC 应用程序中实现 Spring 安全性?
Posted
技术标签:
【中文标题】如何在 Spring MVC 应用程序中实现 Spring 安全性?【英文标题】:How to Implement Spring security in Spring MVC application? 【发布时间】:2019-07-05 18:03:22 【问题描述】:我是 Spring 安全的新手。我已经实现了 Spring Security 并生成了 JWT 令牌。现在我需要从令牌中获取用户并将其设置在会话中,以便该用户的会话保持到令牌过期或注销。另一方面,我需要从控制器访问 API,但 Spring Security 不允许在没有 JWT 令牌的情况下访问 API。是否可以通过全局设置 JWT 令牌或在所有请求的会话中访问我的控制器中的 API。
这是我到目前为止尝试过的,
UsernamePasswordAuthenticationToken authenticationToken=new UsernamePasswordAuthenticationToken(loginRequest.getUserName(), loginRequest.getPassword());
Authentication authentication = this.authenticationManager.authenticate(authenticationToken);
SecurityContextHolder.getContext().setAuthentication(authentication);
String jwt = tokenProvider.generateToken(authentication);
logger.info("jwt is:"+jwt);
logger.info("authentication:"+authentication.getName());
User user2 = new User();
user2.setUserFirstName(user.getFirstName());
user2.setUserLastName(user.getLastName());
request.getSession().setAttribute("loggedInUser",user2);
request.getSession().setMaxInactiveInterval(60);
request.getSession().setAttribute("menu", MenuUtils.buildMenu(user2));
return "home";
我在用户登录时执行此操作。我在前端使用 Thymeleaf。
提前感谢您的帮助!!
【问题讨论】:
【参考方案1】:访问api时需要将jwt token添加到请求头中:
headers.add(HttpHeaders.AUTHORIZATION, "Bearer " + jwt);
这允许 api 读取标题,并检查用户及其权限
您不需要将用户存储在会话中。令牌本身有一个到期日期,它应该在每次请求时从浏览器发送到服务器。
【讨论】:
我们可以在不使用请求标头的情况下全局设置 jwt 令牌吗? 我知道这看起来很容易,但保持状态很难。这是一篇不错的文章codematters.tech/…以上是关于如何在 Spring MVC 应用程序中实现 Spring 安全性?的主要内容,如果未能解决你的问题,请参考以下文章
在我的 Spring MVC 应用程序中实现 Spring Actuator 而不添加 Spring Boot