使用多页面的springboot2 web应用,一般用什么方式使用jwt作为token进行安全验证

想咨询一下
由于之前的页面存在多个页面,更新页面后,存储在页面上的信息会消失.
但是也不想使用基于session的权限安全验证

想使用多页面的springboot2 web应用,一般用什么方式使用jwt作为token进行安全验证

有没有相关例子或教程可以参考一下


回答:

我之前写的一个小玩意,代码不一定好看,参考代码https://github.com/mitu2/webm...

用的是Spring Security, 思路是这样的登陆成功后给前端发一个JWT生成的加密串,然后让前端发送请求的时候都加上TOKEN_HEADER 请求头,通过JWTTokenFilter拿到加密后JwtUtils.getUsername(token)拿到用户名, 如果正确就给SecurityContextHolder.getContext() set一个UsernamePasswordAuthenticationToken, 不过后面我又改成了Spring Security 的形式

public class JWTTokenFilter extends BasicAuthenticationFilter {

private static final Logger log = LoggerFactory.getLogger(JWTTokenFilter.class);

/**

* Token请求头名称

*/

public static final String TOKEN_HEADER = "Authorization";

/**

* Token前缀

*/

public static final String TOKEN_PREFIX = "Bearer";

/**

* WebSocket

*/

public static final String SOCKET_HEADER = "token";

private final UserDetailsService userService;

public JWTTokenFilter(AuthenticationManager authenticationManager, UserDetailsService userService) {

super(authenticationManager);

this.userService = userService;

}

@Override

protected void doFilterInternal(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull FilterChain filterChain) throws ServletException, IOException {

final String token = getToken(request);

//noinspection ConstantConditions

do {

if (token == null || isLogin()) {

break;

}

final String username;

try {

username = JwtUtils.getUsername(token);

} catch (Exception e) {

if (log.isDebugEnabled()) {

log.debug(e.getMessage(), e);

}

break;

}

Optional.ofNullable(userService.loadUserByUsername(username))

.ifPresent(userDetails -> {

UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDetails, token, userDetails.getAuthorities());

authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));

SecurityContextHolder.getContext().setAuthentication(authenticationToken);

if (log.isDebugEnabled()) {

log.debug("用户{}校验成功!", username);

}

});

} while (false);

filterChain.doFilter(request, response);

}

private String getToken(HttpServletRequest request) {

boolean isWebSocket = "websocket".equalsIgnoreCase(request.getHeader("Upgrade"));

return isWebSocket ?

request.getParameter(SOCKET_HEADER) :

Optional.ofNullable(request.getHeader(TOKEN_HEADER))

.orElse("")

.replaceFirst(TOKEN_PREFIX, "")

.replace(" ", "");

}

private boolean isLogin() {

final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

return authentication != null && authentication.isAuthenticated();

}

}


与答案无关: JWT就是一个加密工具,你用其他加密工具也可以无非就是换一种方式而已

以上是 使用多页面的springboot2 web应用,一般用什么方式使用jwt作为token进行安全验证 的全部内容, 来源链接: utcz.com/p/944415.html

回到顶部