`
Kenny.Lee
  • 浏览: 515725 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

编写使用SpringSecurity的JUnit测试提醒

    博客分类:
  • J2EE
 
阅读更多

近日在使用SpringSecurity的项目中发现一个小问题,就是在接口上加了@Secured标注限制调用接口权限时,某些JUnit无法正常调用了。

 

 

例如:

 

	@Secured(PrivilegeDAO.ROLE_REMIND_CREATE)
	public Serializable save(Users user) throws BusinessException;

 

 

调用save方法时,必须具备 PrivilegeDAO.ROLE_REMIND_CREATE权限才行。

 

原因很简单,执行JUnit的时候并没有经过SpringSecurity的登录把资源设置到上下文,所以是无登录权限的。而调用接口的时候又要获取执行权限,这当然造成无法调用的局面了。

 

花了点时间,查找资源,找到个解决方案,分享下。其实就是覆盖原来认真配置信息,然后把供单元测试用的TestingAuthenticationToken设置回spring容器当中。所以之后执行单元测试时就有权限了。注意构造TestingAuthenticationToken的时候必须根据项目具体情况来添加GrantedAuthority[]。

 

具体代码参考如下:

 

 

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.ProviderManager;
import org.springframework.security.authentication.TestingAuthenticationProvider;
import org.springframework.security.authentication.TestingAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.context.SecurityContextImpl;

import cn.com.timekey.drugmonitor.po.Privilege;

/**
 * @author kennylee
 *
 */
public class SecurityTestingUnit {

	/**
	 * 设置SpringSecurity的登录用户权限。
	 *
	 * @param ctx
	 * @param auths
	 */
	public static void setAuthToken(BeanFactory ctx, GrantedAuthority[] auths) {
		TestingAuthenticationToken token = new TestingAuthenticationToken(
				"admin", "test", auths);
		// Override the regular spring configuration
		ProviderManager providerManager = (ProviderManager) ctx
				.getBean("authenticationManager");
		List<AuthenticationProvider> list = new ArrayList<AuthenticationProvider>();
		TestingAuthenticationProvider testingAuthenticationProvider = new TestingAuthenticationProvider();
		list.add(testingAuthenticationProvider);
		providerManager.setProviders(list);

		// Create and store the SpringSecurity SecureContext into the
		// SecurityContextHolder.
		SecurityContextImpl secureContext = new SecurityContextImpl();
		secureContext.setAuthentication(token);
		SecurityContextHolder.setContext(secureContext);
	}

	/**
	 * 构造权限组
	 *
	 * @param rolePrivileges
	 * @return
	 */
	public static GrantedAuthority[] generateAuthorities(
			Collection<Privilege> privileges) {
		GrantedAuthority[] auths = new GrantedAuthority[privileges.size()];
		if (!privileges.isEmpty()) {
			int count = 0;
			for (Privilege rolePrivilege : privileges) {
				String privilegeName = rolePrivilege.getPrivilegeName();
				GrantedAuthority authority = new GrantedAuthorityImpl(
						privilegeName);
				auths[count] = authority;
				count++;
			}
		}
		return auths;
	}

}

 

其中generateAuthorities只是我的一个辅助构造方法。不是重点内容。setAuthToken为主体代码。

 

参考见:http://fishdujour.typepad.com/blog/2005/02/junit_testing_w.html

 

1
9
分享到:
评论

相关推荐

    综合spring mvc + spring + hibernate + bootstrap开发图书管理系统

    7. **任务调度**:使用Quartz或Spring Task进行定时任务,如自动提醒借阅到期的用户。 8. **邮件服务**:集成SMTP发送邮件通知,如注册验证、借阅提醒等。 9. **报表生成**:如使用JasperReports或iText生成统计报告...

    围绕 软件优雅设计规约,基于Spring Boot 的 Java Web 开发框架,帮助使用者开发更易于阅读维护的代.zip

    Spring Boot与JUnit、Mockito等测试框架结合,能方便地进行单元测试和集成测试。 5. **异常处理**:优雅地处理异常,提供有意义的错误信息,而不是简单的堆栈跟踪。Spring Boot的全局异常处理机制可以帮助我们统一...

    基于java的-152-springboot大学生体质测试管理系统--LW-源码.zip

    11. **定时任务**:如果系统包含定期体质测试提醒或数据分析功能,可能会使用SpringBoot的定时任务(@Scheduled)或Quartz等第三方库。 综上所述,这款基于Java的SpringBoot大学生体质测试管理系统充分利用了...

    基于Java的共享自习室系统.zip

    7. **测试与部署**:单元测试确保代码质量,如JUnit或TestNG,集成测试确保各组件协同工作。部署可能使用Docker容器化技术,结合Jenkins持续集成/持续部署(CI/CD)流程。 8. **安全性考虑**:数据传输应使用HTTPS...

    使用Java开发的图书管理系统.zip

    使用Spring Security进行身份验证和授权。 2. 图书模块:包括图书信息的增删改查,以及分类管理。可能使用枚举类型来表示图书类别,便于维护。 3. 借阅归还模块:记录图书的借阅状态,实现借书、续借、还书等操作,...

    本科毕业设计 - 报销单管理系统.zip

    - **测试**:编写单元测试和集成测试,确保代码质量,可以使用JUnit和Mockito等工具。 - **部署**:系统可能部署在Docker容器中,利用Docker Compose或Kubernetes进行集群管理。 - **文档**:编写清晰的用户手册和...

    基于Springboot的高校心理教育辅导设计与实现(有报告) Javaee项目,springboot项目

    8. **测试**:单元测试和集成测试的编写,使用JUnit和Mockito等工具。 9. **部署**:可能涵盖了Docker容器化部署,使用Jenkins或GitLab CI/CD实现自动化部署。 这些知识点构成了一个完整的Spring Boot项目开发流程...

    低价机票监测系统小程序源码数据库.zip

    10. **测试**:为了保证系统的稳定性和性能,可能包含了单元测试和集成测试代码,使用JUnit或Mockito等工具进行测试。 总的来说,这个低价机票监测系统是一个涵盖了前后端开发、数据库设计、任务调度、消息推送等多...

    springboot002基于springboot的医护人员排班系统.zip

    8. **单元测试与集成测试**:JUnit和Mockito等工具用于编写测试代码,确保系统的正确性。 9. **持续集成/持续部署(CI/CD)**:使用Jenkins、GitLab CI/CD或GitHub Actions等工具实现自动化构建和部署。 在【压缩...

    基于Spring MVC的在线批改作业系统项目源码(可作为毕业设计和期末大作业).zip

    10. **单元测试与集成测试**:Spring MVC项目通常包含JUnit测试,用于验证单个组件的功能。而Mockito等工具可能用于模拟依赖,进行集成测试,确保整个系统的协同工作。 通过学习和分析这个项目源码,学生可以深入...

    基于ssm亲海社区医院儿童预防接种管理系统.zip

    6. **测试代码**:JUnit或其他测试框架编写的测试用例,用于验证系统功能的正确性。 7. **文档**:可能包含需求文档、设计文档、使用手册等,帮助理解和使用系统。 8. **构建文件**:如pom.xml(如果使用Maven)或...

    基于springboot的简单增删改查功能的日程管理系统.rar

    - 利用JUnit和Mockito进行单元测试,确保每个功能模块的正确性。 7. **持续集成与部署** - 配置Docker,将应用打包成镜像,实现一键部署。 - 利用Jenkins或GitLab CI/CD,实现自动化构建和测试。 总的来说,这...

    基于SSM的时间管理系统源码.zip

    - 测试:编写单元测试和集成测试,确保代码质量,可以使用JUnit和Mockito等工具。 总的来说,基于SSM的时间管理系统是一个涵盖了后端开发、数据库设计、前端展示等多个方面的综合项目,对于学习Java Web开发和SSM...

    基于springboot的物业管理系统.zip

    6. 测试:使用JUnit或Spring Boot的测试支持进行单元测试和集成测试。 7. 部署:将项目打包成可执行的jar文件,直接运行。 在"estate-master"这个文件夹中,可能包含了整个物业管理系统的源代码,包括实体类、控制...

    java毕业设计&课设-仿美团外卖.zip

    11. **单元测试与集成测试**:项目中应该包含JUnit或其他测试框架编写的测试用例,确保代码质量和功能的正确性。 12. **Docker容器化部署**:提供的项目部署视频可能涉及到Docker,用于封装应用环境,确保在不同...

    基于springboot的OA协同办公系统源码.zip

    6. **单元测试**:SpringBoot提供了JUnit和Mockito等工具,用于编写单元测试,确保代码质量。 7. **前端界面**:可能采用了React、Vue或Angular等前端框架,结合Thymeleaf或Freemarker等模板引擎,实现交互式用户...

    【计算机专业Springboot2-毕业设计100套之】驾校管理系统等

    7. **测试**:SpringBoot支持单元测试和集成测试,可以使用JUnit、Mockito等工具进行测试驱动开发,确保代码质量。 通过这个毕业设计,学生不仅可以掌握SpringBoot2的基本用法,还能学习到如何将理论知识应用于实际...

    基于SpringBoot的体育运动场馆管理系统.zip

    8. **测试与部署**: 使用JUnit进行单元测试,确保代码质量;通过Docker进行容器化部署,提高部署的便捷性和可移植性。 9. **文档编写**: 需要编写详细的系统设计文档、用户手册和技术文档,以便于他人理解和维护。 ...

    毕业设计:基于springboot实现的智能物业管理系统.zip

    - 单元测试:使用JUnit和Mockito编写单元测试,确保代码质量。 - Actuator:SpringBoot内置的监控和健康检查工具,可实时查看系统状态,如内存使用、线程信息等。 7. **持续集成/持续部署(CI/CD)** - Jenkins...

    SpringBoot摄影网站系统代码

    11. **单元测试和集成测试**:JUnit和Mockito用于编写测试用例,确保代码质量。 综上所述,SpringBoot摄影网站系统代码涉及了多种技术栈,涵盖了后端开发、前端展示、数据库管理、安全控制等多个方面,是一个综合性...

Global site tag (gtag.js) - Google Analytics