本文将大概讲述如何在自己的项目中使用spring security。
<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>
<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>
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebAppSecurityConfig extends WebSecurityConfigurerAdapter {
}
@EnableGlobalMethodSecurity(prePostEnabled=true)注解表示启用全局方法权限管理功能。
@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();
@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;
}
@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";
}
使用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来进行权限控制还是比较麻烦。