当前位置: 代码网 > it编程>编程语言>Java > spring security登录认证授权的项目实践

spring security登录认证授权的项目实践

2025年01月21日 Java 我要评论
是什么spring security 主要实现了authentication(认证,解决who are you? ) 和 access control(访问控制,也就是what are you all

是什么

spring security 主要实现了authentication(认证,解决who are you? ) 和 access control(访问控制,也就是what are you allowed to do?,也称为authorization)。spring security在架构上将认证与授权分离,并提供了扩展点

使用-1 快速开始 引入依赖,出现登录页面

<!-- 实现对 spring mvc 的自动化配置 -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
</dependency>
<!-- 实现对 spring security 的自动化配置 -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-security</artifactid>
</dependency>

在这里插入图片描述

自定义登录的用户名密码(练手)

配置类继承适配器 websecurityconfigureradapter, 重写configure方法,实现userdetailsservice接口,设置用户名,密码

在这里插入图片描述

从数据库读取密码

配置类继承适配器 websecurityconfigureradapter, 重写configure方法,实现userdetailsservice接口,调用userdetailsservice的已有的实现类,或者调用自定义的类,实现了userdetailsservice实现类接口,重写loaduserbyusername方法(数据库查登录的用户名密码)

在这里插入图片描述

在这里插入图片描述

认证逻辑

认证逻辑:securitycontextpersistencefilter security上下文持久化过滤器拿到登录信息,生成session存储 ->securitycontextholderstrategy 策略 ->threadlocalsecuritycontextholderstrategy 用的threadlocal
abstractauthenticationprocessingfilter 的 dofilter方法->attemptauthentication方法->authenticationmanager接口的authenticate接口方法
->retrieveuser->getuserdetailsservice().loaduserbyusername(获取到自定义的数据库获取用户名密码方法)–>authenticate方法中 调用additionalauthenticationchecks
检查用户名密码的准确性–>正确的话就走认证成功的逻辑,认证成功后 ->securitycontextholder.getcontext().setauthentication设置登录信息到上下文;错误就走认真失败的逻辑

自定义认证成功失败的处理

在这里插入图片描述

](https://img-blog.csdnimg.cn/direct/7a9f49e75ae34c599bed5ed3ff7298c3.png)

在这里插入图片描述

自定义登录成功失败逻辑(执行方法步骤)原理:认证成功后: successforwardurl–>forwardauthenticationsuccesshandler->调用了authenticationsuccesshandler 的onauthenticationsuccess 方法
因此可以实现authenticationsuccesshandler接口,重写 onauthenticationsuccess 方法
认证失败同理:failureforwardurl->forwardauthenticationfailurehandler->调用了 forwardauthenticationfailurehandler的 onauthenticationfailure 方法
因此可以实现 forwardauthenticationfailurehandler接口,重写 onauthenticationfailure 方法

会话管理(session)

是什么?http请求是无状态的,因此需要在浏览器和服务器端存储状态,即会话。
tomcat 会生成session对象,响应的时候会带给客户端存到浏览器的cookie中,
下次再请求服务器时,带上jsessionid,和服务器的jsessionid比对,相同的话响应,否则不响应

原理 :securitycontextholder.getcontext().getauthentication()可以获取到登录信息,因为登录的认证信息存在 securitycontext上下文中
abstractauthenticationprocessingfilter 的 dofilter方法 -> successfulauthentication 认证成功后 ->securitycontextholder.getcontext().setauthentication 登录的认证信息存在 securitycontext上下文中

会话并发控制-spring security实现

同一个账号只能同时登录一次(后面登录人把前面登录人挤掉)—>可以用redis实现,此处是用spring security实现
http.sessionmanagement().maximumsessions(1)原理:abstractauthenticationprocessingfilter -> sessionstrategy.onauthentication()-> concurrentsessioncontrolauthenticationstrategy 的onauthentication方法比较当前登录的session个数是否小于我们自己设置 -> 是的话就session 设置过期- >concurrentsessionfilter 并发session过滤器 -> dofilter方法 -> 没有过期则登录成功,否则走session过期策略
可自定义实现sessioninformationexpiredstrategy接口重写onexpiredsessiondetected方法
问题:http.sessionmanagement().maximumsessions(1).maxsessionspreventslogin(true) //超过最大的登录数,阻止登录
问题:我们在yml配置的http session设置的超时时间和内部sessioninformation 是重新的一个session,超时时间和之前不同,导致http session设置的超时时间超时了,但是sessioninformation 没超时会报多人同时登录的错误最好不要用,可以用redis实现

会话并发控制-redis实现

实现原理:引入的spring session包中有个session仓库的过滤器 sessionrepositoryfilter -> dofilter方法 ->commitsession ->sessionrepository.save(session)实现了重写了redissessionrepository中save 方法,把session存到redis中

1.引入spring session依赖

<dependency>
<groupid>org.springframework.session</groupid>
<artifactid>spring-session-data-redis</artifactid>
</dependency>
<dependency>
<groupid>redis.clients</groupid>
<artifactid>jedis</artifactid>
<version>3.1.0</version>
</dependency>

2.修改application.yml

session:
    store-type: redis
  redis:
    host: localhost
    port: 6379

3.开启多个项目实例即可测试

remember me实现

设置数据源,spring security会自动把用户信息存储到数据源中,下次登录直接比对数据库值就ok
原理:remembermeauthenticationfilter -> dofilter方法 -> autologin ->abstractremembermeservices的autologin ->persistenttokenbasedremembermeservices 的processautologincookie 取出remember-me的值拆分为series和token 去数据库根据series找到记录,看token是否一致一致就调用 getuserdetailsservice().loaduserbyusername方法,实现自动登录

在这里插入图片描述

在这里插入图片描述

退出登录

原理:logoutfilter-> dofilter方法 -> securitycontextlogouthandler的logout方法,setauthentication为null清除认证状态,销毁httpsession对象
simpleurllogoutsuccesshandler的onlogoutsuccess 重定向到登录页面

csrf跨站请求伪造

从 spring security4开始csrf防护默认开启,默认会拦截请求,进行csrf处理。csrf为了保证不是其他第三方网站访问,要求访问时携带参数名为 _csrf 值为token(token 在服务端产生,在渲染请求页面时埋入页面)的内容,如果token和服务端的token匹配成功,则正常访问。
原理:csrffilter -> dofilter方法 -> 如果没有token 先生成一个,然后放到填充到csrf_token中返回给页面,会再走一遍dofilter方法去比对csrf_token和服务端的token是否能匹配成功,成功则可以访问,否则不能访问

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

授权

这里是引用访问控制url的匹配
antmatchers ant 表达式,统配符 ? 匹配任何单字符,* 匹配0或者任意数量的字符, ** 匹配0或者更多的目录
hasauthority 有…的角色权限
hasanyauthority 有多个角色权限,符合一个即可
自定义403处理方案
使用 spring security 时经常会看见 403(无权限)。spring security 支持自定义权限受限处理,需要
实现 accessdeniedhandler接口
基于方法的授权
1.jsr250注解,可以定义在方法和类上面
配置类开启@enableglobalmethodsecurity(jsr250enabled = true,securedenabled = true,prepostenabled = true)
@rolesallowed 访问对应方法时所应该具有的角色
@permitall 不进行权限控制
@denyall 无论什么角色都不能访问
2.@secured注解专门用于判断是否具有角色的,能写在方法或类上。参数要以 role_开头
配置类开启@enableglobalmethodsecurity(jsr250enabled = true,securedenabled = true,prepostenabled = true)
3.支持表达式注解
配置类开启@enableglobalmethodsecurity(jsr250enabled = true,securedenabled = true,prepostenabled = true)
使用@preauthorize和@postauthorize 在方法之前,之后进行访问控制

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

授权原理:filtersecurityinterceptor -> dofilter方法 -> invoke-> beforeinvocation -> attemptauthorization -> decide(affirmativebased) -> vote 投票是否通过授权通过则可以访问资源,失败则跳转到登录页面认证

到此这篇关于spring security登录认证授权的项目实践的文章就介绍到这了,更多相关spring security登录认证授权内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com