记录SpringSecurity+jwt 登录

本文详细记录了使用SpringSecurity和jwt进行登录认证的步骤,包括配置拦截器、登录验证、角色权限设置以及基于菜单的权限控制。讲解了如何处理登录验证、生成和解析token,以及自定义UserDetailsService实现角色权限控制。此外,还提到在登录时获取并返回用户菜单路由,供前端展示。
摘要由CSDN通过智能技术生成

登录

前言:有的东西久了容易忘记。记录一下。点点记录

先了解登录需要做什么

  1. 拦截请求,否则登录没有意义了
  2. 登录
  3. 单点登录?
  4. 怎么验证登录

开始

  1. 创建springboot项目(单体项目记录轻松一点也好理解分布式了解了单体,在知道一些思路就能配出来)
  2. 引入jar包
   	<!-- security -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency> 
    <!-- jwt 目前最新0.9.1 -->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>
  1. 目的是要登录,啷个晓得是登录嘞,前端请求后端只有个地址和参数。只能从这上面验证。security有个类 WebSecurityConfigurerAdapter
@Configuration  //配置
@EnableWebSecurity	//启用security
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AuthenticationConfig extends WebSecurityConfigurerAdapter {
   
    @Autowired
    JwtAuthorizationTokenFilter authenticationTokenFilter;
    /**
     * 功能描述: <br>
     * 装载BCrypt密码编码器
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
   
        return new BCryptPasswordEncoder();
    }

    /**
     * 功能描述: <br>
     * 自定义拦截
     */
    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
   
        httpSecurity
                .authorizeRequests()
                // 对于获取token、swagger api不拦截
                .antMatchers("/login","/swagger-ui.html/**","/swagger-resources/**", "/webjars/**", "/v2/**").permitAll()
                //前后端分离-前端会请求两次,一次是OPTIONS 一次才是我们的post,如果拦截会停止请求
                .antMatchers(HttpMethod.OPTIONS, "/**").anonymous()
                // 除上面外的所有请求全部需要鉴权认证
                .anyRequest().authenticated()
                .and()
                //禁用 Spring Security 自带的跨域处理用自定义
                .csrf().disable()
                // 基于token,所以不要session
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        // 禁用缓存
        httpSecurity.headers().cacheControl();
        // 添加JWT验证请求中的token
        httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
   
        return super.authenticationManagerBean();
    }
}

EnableGlobalMethodSecurity注解详解
这里配置是最基本的,配置了一个请求,实际WebSecurityConfigurerAdapter有多个方法,需要根据实际情况。
configure(HttpSecurity http):这个方法配置拦截
configure(WebSecurity web):配置跳过验证,会跳过配置的jwt拦截
configureGlobal(AuthenticationManagerBuilder auth):配置请求的认证,在jwt拦截之前先去这里认证一下,根据实际情况而用。

  1. 开启了security,拦截了请求,开始登录。
    Security是一个权限框架,有权限就需要设置其他东西,这里只是登录。
    我这里是:先基本的验证账号密码、查询数据、匹配密码(待会儿会说)、生成token、返回给前端。
@ApiOperation(value = "登录接口",notes = "根据用户名和密码登录")
    @PostMapping(value = "/login")
    public Result login(@RequestBody SysUser sysUser) {
   
        //验证账号密码
        if (StringUtils.isBlank(sysUser.getUsername()) || StringUtils.isBlank(sysUser.getPassword())){
   
            return Result.fail("请检查账号密码");
        }
        //请求查询
        SysUser one = sysUserService.getUser(sysUser);
        //如果查询有数据-生成token
        if (Optional.ofNullable(one).isPresent()){
   
            BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
            if (!encoder.matches(sysUser.getPassword(),one.getPassword())){
   
                return Result.fail("账号/密码错误");
            }
            //因为只是做登录不需要拿权限,不需要给Security存储用户和角色等信息
            final String token = jwtTokenUtil.generateToken(String.valueOf
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值