Jwt添加用户角色

"该博客介绍了如何在JWT(JSON Web Token)中添加用户角色,以实现API的权限控制。通过在JWT的claim中添加角色信息,可以对API进行角色限定,如[Authorize(Roles = "Admin")]。在API调用时,将token放入header中,通过验证token中的角色,确保只有具备特定角色的用户才能访问受限资源。当角色变更时,无需重新验证授权,提高了系统效率。"
摘要由CSDN通过智能技术生成

Jwt添加用户角色

1.打开authoricate控制器
2.找到登陆api,接下来会将身份角色加入到claim中

一.claim解析

在这里插入图片描述
2.api的权限就是根据claim要求
在这里插入图片描述

在这里插入图片描述
//1.确定你是不是你也就是登陆,是有航空公司决定的,确定你后,发放登机牌
//2.确定你能坐什么舱是机组人员的来决定的
//3.登陆和授权严格区分
在这里插入图片描述
在这里插入图片描述

1.这样登陆和授权分开,就不用再验证发生改变后,也改变授权了
2.claim是对于所有身份验证体系而言,jwt只是其中一个应用

二.角色的使用

    var claims = new[]
            {
                //sub
                //第一个是id在jwt中有个专有名词sub ,第二个是用户的准确id,现在用的是假id
                new Claim(JwtRegisteredClaimNames.Sub,"fake_user_id"),
                
                //添加角色claim
                new Claim(ClaimTypes.Role,"Admin")
            };

2.在 api上加入角色限定

 [HttpPost]
        //上锁,除了登陆的用户无法访问
        [Authorize(Roles ="Admin")]

三.请求api

在这里插入图片描述
1.然后将得到的token复制到header中,添加bearer+空格+token中
2.在body中添加数据
在这里插入图片描述
3.执行成功
在这里插入图片描述

四.验证admin起作用

1.在apicontroller中删除admin,重新生成token
2.重复上面操作,发现创建资源失败
在这里插入图片描述

Spring Security是一个基于Spring的安全框架,它提供了一组可以在Spring应用程序中配置的安全服务。JWT(JSON Web Token)是一种用于在网络应用间传递信息的简洁的、URL安全的表述性声明规范。JWT通过在用户和服务器之间传递安全令牌来实现身份验证和授权。结合使用Spring Security和JWT可以实现角色权限控制。 具体实现步骤如下: 1.添加Spring Security和JWT的依赖。 2.创建一个实现UserDetailsService接口的类,用于从数据库中获取用户信息。 3.创建一个实现JwtTokenUtil接口的类,用于生成和解析JWT。 4.创建一个实现AuthenticationEntryPoint接口的类,用于处理未授权的请求。 5.创建一个实现AccessDeniedHandler接口的类,用于处理授权失败的请求。 6.创建一个继承WebSecurityConfigurerAdapter的类,用于配置Spring Security。 7.在配置类中添加一个JwtAuthenticationTokenFilter过滤器,用于验证JWT。 8.在需要进行权限控制的方法上添加@PreAuthorize注解,指定需要的角色或权限。 示例代码如下: ```java // UserDetailsService实现类 @Service public class UserDetailsServiceImpl implements UserDetailsService { @Autowired private UserService userService; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userService.getUserByUsername(username); if (user == null) { throw new UsernameNotFoundException("用户名不存在"); } return new JwtUserDetails(user); } } // JwtTokenUtil实现类 @Component public class JwtTokenUtilImpl implements JwtTokenUtil { private static final String CLAIM_KEY_USERNAME = "sub"; private static final String CLAIM_KEY_CREATED = "created"; @Value("${jwt.secret}") private String secret; @Value("${jwt.expiration}") private Long expiration; @Override public String generateToken(UserDetails userDetails) { Map<String, Object> claims = new HashMap<>(); claims.put(CLAIM_KEY_USERNAME, userDetails.getUsername()); claims.put(CLAIM_KEY_CREATED, new Date()); return generateToken(claims); } @Override public String getUsernameFromToken(String token) { String username; try { Claims claims = getClaimsFromToken(token); username = claims.getSubject(); } catch (Exception e) { username = null; } return username; } @Override public boolean validateToken(String token, UserDetails userDetails) { JwtUserDetails user = (JwtUserDetails) userDetails; String username = getUsernameFromToken(token); return username.equals(user.getUsername()) && !isTokenExpired(token); } private Claims getClaimsFromToken(String token) { Claims claims; try { claims = Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) .getBody(); } catch (Exception e) { claims = null; } return claims; } private boolean isTokenExpired(String token) { Date expirationDate = getExpirationDateFromToken(token); return expirationDate.before(new Date()); } private Date getExpirationDateFromToken(String token) { Claims claims = getClaimsFromToken(token); return claims.getExpiration(); } private String generateToken(Map<String, Object> claims) { Date expirationDate = new Date(System.currentTimeMillis() + expiration * 1000); return Jwts.builder() .setClaims(claims) .setExpiration(expirationDate) .signWith(SignatureAlgorithm.HS512, secret) .compact(); } } // AuthenticationEntryPoint实现类 @Component public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint { @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) throws IOException, ServletException { response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "未授权的请求"); } } // AccessDeniedHandler实现类 @Component public class JwtAccessDeniedHandler implements AccessDeniedHandler { @Override public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e) throws IOException, ServletException { response.sendError(HttpServletResponse.SC_FORBIDDEN, "权限不足"); } } // 配置类 @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService; @Autowired private JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; @Autowired private JwtAccessDeniedHandler jwtAccessDeniedHandler; @Autowired private JwtTokenFilter jwtTokenFilter; @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService) .passwordEncoder(passwordEncoder()); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/login").permitAll() .anyRequest().authenticated() .and() .exceptionHandling() .authenticationEntryPoint(jwtAuthenticationEntryPoint) .accessDeniedHandler(jwtAccessDeniedHandler) .and() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS); http.addFilterBefore(jwtTokenFilter, UsernamePasswordAuthenticationFilter.class); } } // JwtAuthenticationTokenFilter过滤器 @Component public class JwtTokenFilter extends OncePerRequestFilter { @Autowired private UserDetailsService userDetailsService; @Autowired private JwtTokenUtil jwtTokenUtil; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { String authHeader = request.getHeader("Authorization"); if (authHeader != null && authHeader.startsWith("Bearer ")) { String authToken = authHeader.substring(7); String username = jwtTokenUtil.getUsernameFromToken(authToken); if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { UserDetails userDetails = userDetailsService.loadUserByUsername(username); if (jwtTokenUtil.validateToken(authToken, userDetails)) { UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); SecurityContextHolder.getContext().setAuthentication(authentication); } } } chain.doFilter(request, response); } } // 在需要进行权限控制的方法上添加@PreAuthorize注解 @PreAuthorize("hasAnyRole('ADMIN','USER')") public void someMethod() { // do something } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有诗亦有远方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值