SpringSecurity+Jwt 重点认证+授权

注意点:

1. 需要有一定SpringSecurity基础,因为只讲重点!

2. SpringSecurity版本6.1.0

认证

核心点

1. 这里只做账号密码认证, 不用关心权限!
2. 这里核心就是 把用户输入的账号密码和数据库中的账号密码传给SpringSecurity
SpringSecurity会帮我们做比较

核心代码

步骤一: 传入用户输入的账号和密码给SpringSecurity

    public Result login(@RequestBody @Valid LoginDTO dto) {
        String password = dto.getPassword();
        Authentication usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(dto.getUsername(), password);
        Authentication authentication = authenticationManager.authenticate(usernamePasswordAuthenticationToken);

        LoginUserBO user = (LoginUserBO) authentication.getPrincipal();
        String token = JwtUtil.createJWT(user.getSysUser());
        return Result.success(token);
    }

步骤二:  查询数据库的账号和密码传给SpringSecurity

//实现UserDetailService
public class UserDetailsServiceImpl implements UserDetailsService {
    @Resource
    private SysUserService sysUserService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        SysUser sysUser = sysUserService.queryByUserName(username);
        Optional.ofNullable(sysUser).orElseThrow(() -> new UsernameNotFoundException("user does not exist!"));
        return new LoginUserBO(sysUser);
    }
}

//LoginUserBO 实现 UserDetails
public class LoginUserBO implements Serializable, UserDetails {

    private SysUser sysUser;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return Collections.emptyList();
    }

    @Override
    public String getPassword() {
        return sysUser.getPassword();
    }

    @Override
    public String getUsername() {
        return sysUser.getUsername();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}

源码-校验密码

上面就是认证的核心流程了 跟着我的截图点进去 最后一张就是源码-比较密码的代码了

授权

核心点

1. 你定义的SpringSecurityConfig一定要加 @EnableMethodSecurity!

否者 @PreAuthorize("hasAuthority('permission_flag')") 不会生效

2. 在每次请求接口的时候把权限丢给SpringSecurity, 可以把权限丢缓存或者用其他方式

核心代码

...

@Log4j2
@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {

    ...

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        ...
        ...
        ...
        //省略了JWT的校验代码

        //下面是把权限丢给SpringSecurity
        Long roleId = Long.valueOf(claims.get("roleId").toString());
        List<SimpleGrantedAuthority> rolePermissionList = getRolePermission(roleId);
        //封装Authentication
        Authentication usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(claims, null, rolePermissionList);
        //存入SecurityContextHolder
SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
        //放行,让后面的过滤器执行
        filterChain.doFilter(request, response);
    }
}

 源码-校验权限

上面就是授权的核心流程了 跟着我的截图点进去 最后一张就是源码-鉴权的代码了

搞定!下班回家了

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring SecurityJWT(JSON Web Token)是一种常见的组合,用于实现身份验证和授权机制。 JWT是一种轻量级的身份验证和授权的解决方案,它使用JSON格式来定义安全声明。JWT通常由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。头部包含算法和令牌类型等信息,载荷包含用户身份和其他相关信息,签名用于验证令牌的完整性和真实性。 Spring Security提供了对JWT的支持,并可以与Spring Boot框架无缝集成。您可以通过以下步骤来实现Spring Security + JWT的集成: 1. 添加依赖:在项目的构建文件中,添加Spring SecurityJWT相关的依赖,如spring-boot-starter-security和jjwt。 2. 配置Spring Security:创建一个继承自WebSecurityConfigurerAdapter的配置类,并重写configure方法来配置Spring Security。在该方法中,您可以定义身份验证和授权规则。 3. 创建JWT工具类:创建一个JWT工具类,用于生成、解析和验证JWT。您可以使用jjwt库来处理JWT操作。 4. 实现用户认证:在Spring Security配置类中,您可以实现UserDetailsService接口,并重写loadUserByUsername方法来根据用户名加载用户信息。在该方法中,您可以从数据库或其他数据源中获取用户信息,并构建一个UserDetails对象返回。 5. 实现JWT过滤器:创建一个自定义的过滤器,用于解析和验证传入请求中的JWT。在该过滤器中,您可以使用JWT工具类来解析JWT,并将用户信息添加到Spring Security的上下文中。 6. 配置Spring Security过滤器链:在Spring Security配置类中,将JWT过滤器添加到过滤器链中,以确保每个请求都经过JWT验证。 通过以上步骤,您可以实现Spring SecurityJWT的集成,实现基于JWT的身份验证和授权机制。这样,您可以使用JWT生成和验证令牌,并通过Spring Security保护您的应用程序资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值