2024年9月spring security(在项目中使用Spring Security进行权限控制)

 更新时间:2024-09-21 08:36:18

  ⑴springsecurity(在项目中使用SpringSecurity进行权限控制

  ⑵SpringSecurity为使用用户名和密码进行身份验证提供了全面的支持,SpringSecurity提供了用于验证用户的内置支持,SpringSecurity为身份验证提供了全面的支持,验证用户身份的最常见方法之一是验证用户名和密码,SpringSecurity提供了三个决策处理器AessDecisionManager的实现类(AffirmativeBased、ConsensusBased、UnanimousBased,基于PasswordEncoder接口的实现类如下:Spring提供了一个名为DelegatingFilterProxy的Filter实现,验证用户身份的常用方法是要求用户输入用户名和密码,SpringSecurity为身份验证。

  ⑶在项目中使用SpringSecurity进行权限控制

  ⑷:导入SpringSecurity环境(pom.xml中添加依赖(web.xml添加代理过滤器:实现认证和授权(认证:SpringSecurityUserService.java(创建Service类、Dao接口类、Mapper映射文件(springmvc.xml(dubbo注解扫描范围扩大(spring-security.xml(springmvc.xml(导入spring-security.xml(TravelItemController类(PreAuthorize(“hasAuthority(’CHECKITEM_ADD’)“):完成权限(travelitem.html(如果没有权限,可以提示错误信息(导入login.html测试登录:显示用户名:用户退出【路径】:pom.xml导入坐标:web.xml添加代理过滤器在父工程的pom.xml中导入SpringSecurity的maven坐标在meinian_web工程的web,xml文件中配置用于整合SpringSecurity框架的过滤器DelegatingFilterProxy在meinian_web工程中按照SpringSecurity框架要求提供SpringSecurityUserService,并且实现UserDetailsSercice接口创建UserService服务接口、服务实现类、Dao接口、Mapper映射文件【路径】:UserService.java接口:UserServiceImpl.java类:UserDao.java(使用用户id查询用户:RoleDao.java(使用用户id查询角色集合:PermissionDao.java(使用角色id查询权限集合:UserDao.xml(使用用户id查询用户:RoleDao.xml(使用用户id查询角色集合:PermissionDao.xml(使用角色id查询权限集合)使用debug跟踪调试,查看user修改meinian_web工程中的springmvc.xml文件,修改dubbo批量扫描的包路径之前的扫描包现在的扫描包此处原来扫描的包为.atguigu.controller,现在改为.atguigu包的目的是需要将我们上面定义的SpringSecurityUserService也扫描到,因为在SpringSecurityUserService的loadUserByUsername方法中需要通过dubbo远程调用名称为UserService的服务【路径】:定义哪些链接可以放行:定义哪些链接不可以方向,即需要有角色、权限才可以放行:认证管理,定义登录账号和密码,并授权访问的角色、权限:设置在页面可以通过iframe访问受保护的页面,默认为不允许默认访问,需要添加security:frame-optionspolicy=”SAMEORIGIN“【讲解】在meinia在springmvc,xml文件中引入spring-security.xml文件在Controller的方法上加入权限控制注解,此处以TravelItemController为例添加页面,没有权限时提示信息设置.在《security:第二步:在Spring-security.xml文件中配置

  ⑸SpringSecurity基础原理

  ⑹SpringSecurity:是一个提供身份验证,授权和保护以防止常见攻击的框架。凭借对命令式和反应式应用程序的一流支持,它为Spring应用程序的安全提供实际标准。SpringSecurity为身份验证,授权和针对常见漏洞的防护提供了全面的支持。它还集成了三方库,以简化其使用。SpringSecurity为身份验证提供了全面的支持。身份验证是我们验证谁试图访问特定资源的身份的方法。验证用户身份的常用方法是要求用户输入用户名和密码。一旦执行了身份验证,我们就会知道身份并可以执行授权。SpringSecurity提供了用于验证用户的内置支持。分为两大主体:基于Servlet和WebFlux的身份验证。SpringSecurity的PasswordEncoder接口用于对密码进行单向转换,以使密码可以安全地存储。基于PasswordEncoder接口的实现类如下:Spring提供了一个名为DelegatingFilterProxy的Filter实现,可以在Servlet容器的生命周期和Spring的ApplicationContext之间进行桥接。Servlet容器允许使用自己的标准注册Filters,但是它不知道Spring定义的Bean。DelegatingFilterProxy可以通过标准的Servlet容器机制进行注册,然后将所有工作委托给实现Filter的SpringBean。如上图所示,DelegatingFilterProxy是一个标准的ServletFilter,当调用链路到DelegatingFilterProxy,DelegatingFilterProxy会找到达Spring管理的Filter,然后发起调用。如上图所示,FilterChainProxy是SpringSecurity提供的特殊过滤器,允许通过SecurityFilterChain委派许多过滤器实例。如上图所示,FilterChainProxy使用SecurityFilterChain确定应对此请求调用哪些SpringSecurity过滤器。SecurityFilter是注册到FilterChainProxy而不是DelegatingFilterProxy的。原因如下:SpringSecurity提供了以下SecurityFilter(包含顺序,通过Filterparator配置相关顺序:如上图表示的是异常处理过滤器ExceptionTranslationFilter的工作原理:如上图所示,ProviderManager作为AuthenticationManager最常见的实现,ProviderManager认证时,将认证逻辑委托给AuthenticationProvider列表,不同AuthenticationProvider的执行不同的认证逻辑。如果没有AuthenticationProvider可以执行身份验证,使用该父AuthenticationManager(通常是ProviderManager实例进行认证。一个父AuthenticationManager可能存在多个ProviderManager实例。即具有相同身份验证(共享父AuthenticationManager但又具有不同身份验证机制(不同ProviderManager实例。验证用户身份的最常见方法之一是验证用户名和密码,SpringSecurity为使用用户名和密码进行身份验证提供了全面的支持。上图表示用户在表单提交用户名、密码的验证流程:上图表示当客户端收到WWW-Authenticate响应头时,使用用户名和密码登录的流程:Remember-Me(记住我,主要用于在一段很长的时间内(通常天,用户只需要登录一次,就无需再登录了(前提是用户名、密码、秘钥不变的情况。原理:当用户登录成功时,服务端会向浏览器额外发送一个cookie(name=remember-me,value=token值),之后的请求都会携带这个cookie,当用户session失效时(比如小时过后,该cookie携带到服务端触发自动登录。当然,Remember-Me会存在一些安全问题,Remember-Me的token可以被用户代理捕获到,可以轻松通过该token去修改密码。因此在一些安全性重要的应用上面,不建议开启Remember-Me。FilterSecurityInterceptor为HttpServletRequests提供授权,它作为安全筛选器之一插入到FilterChainProxy中(除此之外,SpringSecurity支持服务层方法授权还有域对象授权。回顾下前面学到的知识,用户登录认证成功后,会为当前用户生成一个Authentication对象,该对象包含了Principal、Credentials和Authorities;该Authorities由GrantedAuthority(默认实现:SimpleGrantedAuthority集合组成,GrantedAuthority接口只有一个方法,如下:一般情况下GrantedAuthority由String表示,如果GrantedAuthority无法精确地表示为String,则GrantedAuthority被视为“复杂”,并且getAuthority(必须返回null。刚刚讲到SpringSecurity调用AbstractSecurityInterceptor.beforeInvocation()进入前置处理阶段,该阶段的一个重点就是进行访问决策处理,由AessDecisionManager相关实现来完成,AessDecisionManager接口包含三个方法:如上图所示,SpringSecurity提供了三个决策处理器AessDecisionManager的实现类(AffirmativeBased、ConsensusBased、UnanimousBased,代表三种不同的决策处理器,当然也可以自定义决策处理器。决策处理器将决策逻辑委托给多个投票器AessDecisionVoter(具体实现有:AuthenticatedVoter、RoleVoter、WebExpressionVoter等,接着AessDecisionManager将投票结果进行整合,返回拒绝或者成功。AessDecisionManager实现类的具体描述如下:AessDecisionVoter通过返回int来表示投票的结果,有AESS_ABSTAIN(,弃权,AESS_DENIED(-,不通过和AESS_GRANTED(,通过,AessDecisionVoter主要的实现类如下:某些应用程序需要一种修改返回的对象的方法,因此SpringSecurity提供了一个方便的挂钩AfterInvocationManager,通过AfterInvocationManager来修改返回对象。如上图所示,AfterInvocationManager有一个具体的实现AfterInvocationProviderManager,它轮询AfterInvocationProvider的列表。每个AfterInvocationProvider都可以修改返回对象或引发AessDeniedException。实际上,由于前一个提供程序的结果将传递到列表中的下一个,因此多个提供程序可以修改该对象。

您可能感兴趣的文章:

相关文章