spring security 初尝试

spring Security使用

本文将大概讲述如何在自己的项目中使用spring security。

一、环境配置

1.在pom.xml文件中引入相关依赖

		<dependency>
			<groupId>org.springframework.securitygroupId>
			<artifactId>spring-security-webartifactId>
			<version>4.2.10.RELEASEversion>
		dependency>
		<dependency>
			<groupId>org.springframework.securitygroupId>
			<artifactId>spring-security-configartifactId>
			<version>4.2.10.RELEASEversion>
		dependency>
		<dependency>
			<groupId>org.springframework.securitygroupId>
			<artifactId>spring-security-taglibsartifactId>
			<version>4.2.10.RELEASEversion>
		dependency>

2.在web.xml文件中加入过滤器


<filter>
	<filter-name>springSecurityFilterChainfilter-name>
	<filter-class>org.springframework.web.filter.DelegatingFilterProxyfilter-class>
filter>
<filter-mapping>
	<filter-name>springSecurityFilterChainfilter-name>
	<url-pattern>/*url-pattern>
filter-mapping>

3.在config文件夹下创建spring security的配置类

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebAppSecurityConfig extends WebSecurityConfigurerAdapter {
}

@EnableGlobalMethodSecurity(prePostEnabled=true)注解表示启用全局方法权限管理功能。

4.复写父类的方法,放行首页、静态资源

@Override
protected void configure(HttpSecurity security) throws Exception {
    //super.configure(security); 注释掉将取消父类方法中的默认规则
    
    security.authorizeRequests()        //对请求进行授权
            .antMatchers("/layui/**","/index.jsp")   //使用ANT风格设置要授权的URL地址
            .permitAll()                //允许上面使用ANT风格设置的全部请求
            .anyRequest()               //其他未设置的全部请求
            .authenticated();           //需要认证
           
}

解决重定向问题

去登录页面和登录请求本身都需要permitAll()否则登录和去登录页面本身都需要登录,形成死循环。


    
    security.formLogin()
			.loginPage("/admin/toLogin")
			.permitAll()
			.loginProcessingUrl("/admin/security/login.html")
			.defaultSuccessUrl("/admin/to/main/page.html")
			.and()
			.logout()
			.logoutUrl("/admin/security/logout.html")
			.logoutSuccessUrl("/index.html")
			

//禁用CSRF功能。注意:这仅仅是我们学习过程中偷懒的做法,实际开发时还是不要禁用。
	security.csrf().disable();



5.loadUserByUsername(String username)方法

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
	
	// 1.根据用户名从数据库查询Admin对象
	AdminExample adminExample = new AdminExample();
	
	adminExample
		.createCriteria()
		.andLoginacctEqualTo(username);
	
	List<Admin> adminList = adminMapper.selectByExample(adminExample);
	
	if(adminList == null || adminList.size() != 1) {
		return null;
	}
	
	Admin admin = adminList.get(0);
	
	// 2.获取数据库中密码
	// String userpswd = admin.getUserpswd();

	// 3.查询Admin对应的权限信息(包括角色、权限)
	Integer adminId = admin.getId();
	
	// ①创建集合用来存放权限信息
	Collection<GrantedAuthority> authorities = new ArrayList<>();
	
	// ②根据adminId查询对应的角色
	List<Role> roleList = roleMapper.selectAssignRoleList(adminId);
	for (Role role : roleList) {
		
		String roleName = role.getName();
		
		// 注意:一定要加“ROLE_”
		authorities.add(new SimpleGrantedAuthority("ROLE_"+roleName));
	}
	
	// ③根据adminId查询对应的权限
	List<String> authNameList = authMapper.selectAssignedAuthList(adminId);
	for (String authName : authNameList) {
		
		authorities.add(new SimpleGrantedAuthority(authName));
		
	}
	
	// 4.封装到User的子类SecurityAdmin类型的对象中
	User user = new User(username, userpswd, authorities );
	
	return user;
}

二、 使用

1.权限控制

@PreAuthorize(value="hasRole('PM - 项目经理')")
@RequestMapping("/admin/query")
public String queryWithSearch(
			@RequestParam(value="keyword", defaultValue="") String keyword,
			@RequestParam(value="pageNo", defaultValue="1") int pageNo,
			Model model
		) {
	
	// 1.调用Service方法获取分页数据
	PageInfo<Admin> pageInfo = adminService.getAdminPageInfoWithKeyword(keyword, pageNo, ArgumentsConstant.PAGE_SIZE);
	
	// 2.将分页数据存入模型
	model.addAttribute(AttrNameConstant.PAGE, pageInfo);
	
	// 3.跳转页面
	return "admin_page";
}

2.页面元素权限控制

使用SpringSecurity提供的标签可以详细对页面元素进行权限控制。
第一步:导入标签库

<%@ taglib uri="http://www.springframework.org/security/tags" prefix="security" %>

第二步:使用security:authorize标签

<security:authorize access="hasRole('经理')">
	<a href="assign/to/assign/role/page/${admin.id }.html" class="btn btn-success btn-xs">
		<i class=" glyphicon glyphicon-check">i>
	a>
security:authorize>

结语

通过spring security来进行权限控制还是比较麻烦。

你可能感兴趣的:(spring项目实践)