# spring-security-jwt **Repository Path**: eric-tutorial/spring-security-jwt ## Basic Information - **Project Name**: spring-security-jwt - **Description**: 简单地SpringSecurity与jwt结合的正常例子 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: https://github.com/zhshuixian/learn-spring-boot-2.git - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2020-04-30 - **Last Updated**: 2024-03-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: 自己开发的应用, Java ## README SpringSecurity的JWT认证 === 原来项目地址 https://github.com/zhshuixian/learn-spring-boot-2.git [SpringSecurity的相关文章](http://www.javaboy.org/categories/Spring-Security/) ## [深入浅出Spring Security(一):三句话解释框架原理](https://blog.csdn.net/zimou5581/article/details/102457672) ### 三句话解释框架原理 1. 整个框架的核心是一个过滤器,这个过滤器名字叫springSecurityFilterChain类型是FilterChainProxy 2. 核心过滤器里面是过滤器链(列表),过滤器链的每个元素都是一组URL对应一组过滤器 3. WebSecurity用来创建FilterChainProxy过滤器, HttpSecurity用来创建过滤器链的每个元素。 ## SpringSecurity的逻辑 TokenFilter是比SpringSecurity先校验的过滤器。TokenFilter的作用就是从token或者session中获取SpringSecurity校验的权限信息。 如果获取不到则看该资源是否支持SpringSecurity匿名访问。 TokenFilter是验证认证的(准确说获取用户信息提交给SpringSecurity的), SpringSecurity则是依据该资源所需要的权限和TokenFilter提交的用户信息来验证该用户是否有授访问该资源。 ![](./asset/img/SpringSecurityJWT.png) ![](./asset/img/token.png) ## 未授权返回json SpringSecurity未授权是重定向login,但是前后端分离,不需要重定向,只用返回json数据,告诉登录失效了。 ![](./asset/img/loginurl.png) ## SpringSecurity的用户名和密码 从下面两张图的调用关系来看,principal对应着用户名username,credentials对应着密码password。 ![img.png](asset/img/img.png) ![img_1.png](asset/img/img_1.png) 整个SpringSecurity的设计应该非常完善,想象之中应该是主要替换jwt的算法和查询数据库登录的部分即可,其他部分应该都是非常晚上的。 [org.xian.token.secutiry.UserDetailsServiceImpl.loadUserByUsername](src/main/java/org/xian/token/secutiry/UserDetailsServiceImpl.java) 这里查询数据库,获取用户信息 [org.xian.token.secutiry.MyAuthenticationSuccessHandler](src/main/java/org/xian/token/secutiry/MyAuthenticationSuccessHandler.java) 这里使用jwt返回token信息。 ### 忽略不需要授权和认证、、 ### 处理用户信息 这个非常重要的类,负责了用户信息处理等 org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser retrieveUser 方法就是根据用户登录输入的用户名去查找用户,如果没找到,就会抛出一个 UsernameNotFoundException,这个异常被 catch 之后,会首先判断是否要隐藏这个异常,如果不隐藏,则原异常原封不动抛出来,如果需要隐藏,则抛出一个新的 BadCredentialsException 异常,BadCredentialsException 异常从字面理解就是密码输入错误的异常。 # 拓展 1. [聊一个 GitHub 上开源的 RBAC 权限管理系统,很6!](http://www.javaboy.org/2020/0925/springsecurity-rbac.html) 参考 https://github.com/cjbi/wetech-admin 2. ```shell ./gradlew clean bootJar -x test ``` ```shell scp build/libs/spring-security-jwt-token-0.0.1-SNAPSHOT.jar insite@insite.cupb.top:/home/insite/app/admin/ ``` 杀死原有进程 ```shell ps -ef|grep 'java'|grep 'spring'|grep 'spring-security-jwt'|grep -v 'grep'|awk '{print $2}'|xargs -tI {} kill -9 {} ``` 启动 ```shell nohup /opt/jbr/bin/java -Dfile.encoding=utf-8 -Duser.timezone=GMT+08 -jar /home/insite/app/admin/spring-security-jwt-token-0.0.1-SNAPSHOT.jar --logging.level.root=warn -Xmx1G -Xms512M -server -XX:+UseG1GC >>/home/insite/app/admin/spring-security.log 2>&1 & ``` # 其他项目可以学习 https://github.com/murraco/spring-boot-jwt