编写使用SpringSecurity的JUnit测试提醒

近日在使用SpringSecurity的项目中发现一个小问题,就是在接口上加了@Secured标注限制调用接口权限时,某些JUnit无法正常调用了。 例如:@Secured(PrivilegeDAO.ROLE_REMIND_CREATE)publicSerializablesave(Usersuser)throwsBusinessException;  调用save方法时,必须具备 PrivilegeDAO.ROLE_REMIND_CREATE权限才行。原因很简单,执行JUnit的时候并没有经过SpringSecurity的登录把资源设置到上下文,所以是无登录权限的。而调用接口的时候又要获取执行权限,这当然造成无法调用的局面了。花了点时间,查找资源,找到个解决方案,分享下。其实就是覆盖原来认真配置信息,然后把供单元测试用的TestingAuthenticationToken设置回spring容器当中。所以之后执行单元测试时就有权限了。注意构造TestingAuthenticationToken的时候必须根据项目具体情况来添加GrantedAuthority[]。具体...

springsecurity的权限学习

https://blog.csdn.net/u012702547/article/details/79010010...
代码星球 代码星球·2021-02-09

Spring Boot 5 SpringSecurity身份验证

对于没有访问权限的用户需要转到登录表单页面。要实现访问控制的方法多种多样,可以通过Aop、拦截器实现,也可以通过框架实现(如:ApacheShiro、SpringSecurity)。pom.xml添加依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId&...

springSecurity安全框架需要引入配置文件spring-security.xml

<?xmlversion="1.0"encoding="UTF-8"?><beans:beansxmlns="http://www.springframework.org/schema/security"xmlns:beans="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security.xsd"><!--以下页面不拦截这里面的配置没有权限也能访问资源--><...

springSecurity安全框架需要配置web.xml文件

<!DOCTYPEweb-appPUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd"><web-app><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-security.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><filter><filter-name>springSecurityFilterChain</f...

springSecurity安全框架需要引入的依赖

1<properties>2<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>3<maven.compiler.source>1.7</maven.compiler.source>4<maven.compiler.target>1.7</maven.compiler.target>5<spring.version>4.2.4.RELEASE</spring.version>6</properties>78<dependencies>9<dependency>10<groupId>junit</groupId>11<artifactId>junit</artifactId>12<version>4.11</version>13<scope>test</scope>14&l...

SpringSecurity-FilterSecurityInterceptor的作用

  FilterSecurityInterceptor也是很重要的一个interceptor,它的作用是对request进行权限判断,允许访问或者抛出accessDenied异常。  这个类继承AbstractSecurityInterceptor,它的代码很多,但是主要的逻辑有两步:(1)查询出request所需的角色;(2)判断用户是否具有该角色从而允许或拒绝  查询request所需角色是从FilterInvocationSecurityMetadataSource中获取的,可以重写这个方法从数据库中获取request所需的角色,但考虑每次请求都访问数据库比较浪费性能,如果url数量不多,可以考虑一次取完。  判断用户是否具有该角色从而允许或拒绝是在AccessDecisionManager的decide方法中执行的。原有逻辑主要是比对request所需角色和用户已有角色,如果匹配,就允许访问,否则拒绝。如果要实现自己的判断逻辑就要重写decide方法。  SpringSecurity的主要思路是在配置文件中配置url的允许访问角色,request时判断当前request所需角色...

SpringSecurity-ExceptionTranslationFilter的作用

  ExceptionTranslationFilter捕获异常并做相应的处理。处理逻辑如下:  1.首先判断是不是SpringSecurity产生的异常,如果是将在handleSpringSecurityException(request,response,chain,ase)处理,否则抛出ServletException/RuntimeException;  2.handleSpringSecurityException方法首先判断是否是AuthenticationException异常,如果是就跳转到登录页面;否则如果是AccessDeniedException,先判断是否是匿名用户,如果是,也将跳转到登录页面,如果是已认证用户,则交给accessDeniedHandler处理。  3.跳转到登录界面前,HttpSessionRequestCache会保存当前请求的url,登录认证通过后会直接跳转到之前访问的页面。使用这个功能不能将<form-login>的always-use-default-target属性设置为TRUE,默认是FALSE的。这个逻辑在SavedR...

SpringSecurity-RememberMeAuthenticationFilter的作用

  启用remember-me功能,在配置文件中的http节点下添加:1<remember-me2remember-me-parameter="remember-me"3remember-me-cookie="remember-me"4token-validity-seconds="86400"5data-source-ref="dataSource"/>这里可以设置表单中的checkbox对应name属性,cookie名称,已经失效时间。在数据库持久化cookie的,还要设置dataSource.   RememberMeAuthenticationFilter和UsernamePasswordAuthenticationFilter的作用和运行过程几乎一致,唯一大的区别就是这里是从数据库中取到cookie信息,并与客户端传到到服务端的cookie信息对照,如果匹配成功,直接生成有效的Authentication放到SecurityContextHolder中。  springSecurity默认的查询代码是:/**ThedefaultSQLusedbythe&...

SpringSecurity-ConcurrentSessionFilter的作用

  ConcurrentSessionFilter主要有两个功能:    (1)每次request时调用SessionRegistry的refreshLastRequest(String)更新session的最后更新时间    (2)每次request时从SessionRegistry中获取SessionInformation,并且判断session是否已失效,如果失效就调用LogoutFilter并注销session(session的认证信息也一起销毁)。这里有sessioin的一些限制逻辑要考虑,如只运行用户只能在一个地方登陆等,我暂时没使用这一块,所以先不深究。 这个Filter逻辑还比较简单,功能也比较明确,下面直接贴核心代码publicvoiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain)throwsIOException,ServletException{HttpServletRequestrequest=(HttpServletRequest)req;HttpServletRespo...

SpringSecurity-SecurityContextPersistenceFilter的作用

  SecurityContextPersistenceFilter每个request只执行一次,以解决servlet容器的兼容性问题(特别是WebLogic)。  它在request执行之前从SecurityContextRepository(一般是HTTPSession)获取信息,产生一个SecurityContextHolder,然后在request结束的时候把信息再复制回(storesitbackin)SecurityContextRepository,并销毁SecurityContextHolder。这个Filter应该在任何进行authentication认证之前执行,因为authentication认证需要SecurityContextHolder有一个完整可用的SecurityContext。  这个Filter存在的原因是显而易见的。request是单独的线程,而安全认证是基于session的,所以每次请求都要讲认证信息从HttpSession中取出,认证完毕后将认证信息再复制回HttpSession(因为request时认证信息可能会发生改变),以备下一个reque...

SpringSecurity-ChannelProcessingFilter的作用

ChannelProcessingFilter决定的是web请求的通道,即http或https。在springsecurity配置文件中添加这样一行<intercept-urlpattern='/**'requires-channel='https'/>ChannelProcessingFilter就会检查这个请求走的是否是https。如果是,就继续向下执行。否则,自动切换到对应的channel! ChannelProcessingFilter有一个成员变量ChannelDecisionManager。ChannelDecisionManager的decide方法即是判断channel是否正确。ChannelDecisionManager的成员变量List<ChannelProcessor>默认有两个Processor:InsecureChannelProcessor和SecureChannelProcessor,这两个Processor分别检查http和https的请求,如果请求的channel不正确,会自动切换(redirect)的对应的chann...

SpringSecurity的Filter执行顺序在源码中的体现

在网上看各种SpringSecurity教程时,都讲到了SpringSecurity的Filter顺序。但是一直不知道这个顺序在源码中是如何体现的。今天一步一步的查找,最终找到顺序是在FilterComparator中定义的。先看一下代码:/***Aninternaluseonly{@linkComparator}thatsortstheSecurity{@linkFilter}*instancestoensuretheyareinthecorrectorder.**@authorRobWinch*@since3.2*/@SuppressWarnings("serial")finalclassFilterComparatorimplementsComparator<Filter>,Serializable{privatestaticfinalintSTEP=100;privateMap<String,Integer>filterToOrder=newHashMap<String,Integer>();FilterComparator(){intord...

SpringBoot整合SpringSecurity时,明明导入了包,但无法实现相关的认证接口。

   问题:SpringBoot整合SpringSecurity时,明明导入了包,但无法实现相关的认证接口。   现象:改Maven,找依赖,看ExternalLibraries相关的jar包相关接口,也存在接口,都无法引入相关的接口WebSecurityConfigurerAdapter,也无法使用@EnableWebSecurity这个注解,无法导入注解需要的包。 解决办法:后来将SpringBoot父模块的统一依赖管理版本降低一点就可以了,降到2.1.3.RELEASE,如下图所示: ...

springBoot+springSecurity 数据库动态管理用户、角色、权限(二)

序: 本文使用springboot+mybatis+SpringSecurity实现数据库动态的管理用户、角色、权限管理本文细分角色和权限,并将用户、角色、权限和资源均采用数据库存储,并且自定义滤器,代替原有的FilterSecurityInterceptor过滤器, 并分别实现AccessDecisionManager、InvocationSecurityMetadataSourceService和UserDetailsService,并在配置文件中进行相应配置。使用众多的拦截器对url拦截,以此来管理权限。但是这么多拦截器,笔者不可能对其一一来讲,主要讲里面核心流程的两个。首先,权限管理离不开登陆验证的,所以登陆验证拦截器AuthenticationProcessingFilter要讲; 还有就是对访问的资源管理吧,所以资源管理拦截器AbstractSecurityInterceptor要讲;但拦截器里面的实现需要一些组件来实现,所以就有了AuthenticationManager、accessDecisionManager等组件来支撑。现在先大概过一...
首页上一页12下一页尾页