当前位置:   article > 正文

Spring Security(基于RBAC模型的权限控制框架)搭建_spring security和rbac什么关系

spring security和rbac什么关系

什么是RBAC模型:

概念

权限管理,这是每个软件系统都会涉及到的,而且权限管理的需求本质往往都是一样,不同的角色拥有不同的权限,只要你充当了某个角色,你就拥有了相对应的功能。

RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联

简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。

这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般都是多对多的关系

 

 

简介

https://docs.spring.io/spring-security/site/docs/4.2.10.RELEASE/guides/html5/helloworld-xml.html

SpringSecurity融合Spring技术栈,提供JavaEE应 用的整体安全解决方案

Spring Security为基于Java EE的企业软件应用提供全面的安全服务

Spring Security只需要少量配置,就能构建一个强大的安全的应用系统。  

目前市面上受欢迎的两个安全框架Apache Shiro、SpringSecurity;

SpringSecurity可以无缝整合Spring应用,具有强大的自动化web安全管控功能。而Shiro是一个轻量级强大的安全框架,可以脱离web应用来提供安全管控,但是对于web的一些定制安全需要手动编写;SpringBoot底层默认整合SpringSecurity作为安全框架,所以我们推荐web应用使用SpringSecurity来控制安全;

概念

认证

authentication:身份验证

“身份验证”是指建立主体(principal)的过程,主体就是他们声称是谁(“主体”通常指用户设备或在应用程序中可以执行动作的其他系统)。也就是“证明你是谁

授权

authorization:授权

“授权”是指确定主体(principal是否被允许执行系统中某个动作的过程。 也就是“你能做什么!”

为了达到“授权”决策(安全框架决定你是否有权限做此事),“身份验证”(authentication)过程已经建立了主体的身份(Principal)

使用方式:

       细分角色和权限,并将用户、角色、权限和资源均采用数据库存储,并且自定义过滤器,代替原有的FilterSecurityInterceptor过滤器, 并分别实现AccessDecisionManager、InvocationSecurityMetadataSourceService和UserDetailsService,并在配置文件中进行相应配置。

在原有项目中实现Spring Security权限控制:

1.在parent中添加spring security的依赖

  1. <!-- spring-security依赖包 -->
  2. <dependency>
  3. <groupId>org.springframework.security</groupId>
  4. <artifactId>spring-security-web</artifactId>
  5. <version>${spring-security.version}</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework.security</groupId>
  9. <artifactId>spring-security-config</artifactId>
  10. <version>${spring-security.version}</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.springframework.security</groupId>
  14. <artifactId>spring-security-taglibs</artifactId>
  15. <version>${spring-security.version}</version>
  16. </dependency>

2.在web.xml中配置spring Security的过滤器进行控制

  1. <filter>
  2. <filter-name>springSecurityFilterChain</filter-name>
  3. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>springSecurityFilterChain</filter-name>
  7. <url-pattern>/*</url-pattern>
  8. </filter-mapping>

3.填写config配置类

  1. package com.atguigu.atcrowdfunding.config;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.context.annotation.Configuration;
  8. import org.springframework.security.access.AccessDeniedException;
  9. import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
  10. import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
  11. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  12. import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  13. import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  14. import org.springframework.security.core.userdetails.UserDetailsService;
  15. import org.springframework.security.web.access.AccessDeniedHandler;
  16. @Configuration // 把该类当成配置文件
  17. @EnableWebSecurity // 开启SpringSecurity
  18. @EnableGlobalMethodSecurity(prePostEnabled=true)//开启细粒度权限
  19. public class AtcrowdfundingSecurityConfig extends WebSecurityConfigurerAdapter {
  20. @Autowired
  21. private UserDetailsService userDetailsService;
  22. // 认证与授权
  23. @Override
  24. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  25. auth.userDetailsService(userDetailsService);
  26. }
  27. // 配置信息
  28. @Override
  29. protected void configure(HttpSecurity http) throws Exception {
  30. http.authorizeRequests()
  31. // 放行的请求
  32. .antMatchers("/static/**", "/welcome.jsp", "/login", "/index").permitAll()
  33. // 剩下的请求必须验证
  34. .anyRequest().authenticated();
  35. // 自定义登录页面
  36. http.formLogin().loginPage("/login")
  37. .usernameParameter("loginacct").
  38. passwordParameter("userpswd")// 登录参数的属性名称
  39. .loginProcessingUrl("/doLogin")// 登录的跳转路径
  40. .defaultSuccessUrl("/main");// 跳转的页面
  41. // 禁用csrf
  42. http.csrf().disable();// 暂时
  43. // //出现异常显示的页面
  44. http.exceptionHandling().accessDeniedHandler(new AccessDeniedHandler() {
  45. @Override
  46. public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
  47. String header = request.getHeader("X-Requested-With");
  48. if("XMLHttpRequest".equals(header)) {
  49. response.getWriter().print("403");
  50. }else {
  51. request.getRequestDispatcher("/WEB-INF/jsp/error/error403.jsp").forward(request, response);;
  52. }
  53. }
  54. });
  55. }
  56. }

4.实现查询数据库进行用户权限认证:

  1. import java.util.HashSet;
  2. import java.util.List;
  3. import java.util.Set;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.security.core.GrantedAuthority;
  6. import org.springframework.security.core.authority.SimpleGrantedAuthority;
  7. import org.springframework.security.core.userdetails.User;
  8. import org.springframework.security.core.userdetails.UserDetails;
  9. import org.springframework.security.core.userdetails.UserDetailsService;
  10. import org.springframework.security.core.userdetails.UsernameNotFoundException;
  11. import org.springframework.stereotype.Component;
  12. import com.atguigu.atcrowdfunding.bean.TAdmin;
  13. import com.atguigu.atcrowdfunding.bean.TAdminExample;
  14. import com.atguigu.atcrowdfunding.bean.TAdminExample.Criteria;
  15. import com.atguigu.atcrowdfunding.bean.TPermission;
  16. import com.atguigu.atcrowdfunding.bean.TRole;
  17. import com.atguigu.atcrowdfunding.mapper.TAdminMapper;
  18. import com.atguigu.atcrowdfunding.mapper.TPermissionMapper;
  19. import com.atguigu.atcrowdfunding.mapper.TRoleMapper;
  20. //实现查询数据库的用户权限的认证
  21. @Component
  22. public class MyUserDetailsService implements UserDetailsService{
  23. @Autowired
  24. private TAdminMapper tAdminMapper;
  25. @Autowired
  26. private TRoleMapper tRolemapper;
  27. @Autowired
  28. private TPermissionMapper tPermissionMapper;
  29. //查询用户的角色和权限数据
  30. @Override
  31. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  32. TAdminExample example=new TAdminExample();
  33. Criteria criteria = example.createCriteria();
  34. criteria.andUsernameEqualTo(username);
  35. //根据用户名查询用户的信息
  36. List<TAdmin> list = tAdminMapper.selectByExample(example);
  37. TAdmin tAdmin=null;
  38. if(list!=null&&list.size()==1) {
  39. tAdmin=list.get(0);
  40. }
  41. //查询用户的角色
  42. List<TRole> roleList=tRolemapper.queryRoleByAdminId(tAdmin.getId());
  43. List<TPermission>permissionList=tPermissionMapper.queryPermissionByAdminId(tAdmin.getId());
  44. //查询用户的角色对应的权限
  45. //List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("ROLE_初级程序员","ROLE_中级程序员");
  46. Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>();
  47. for (TRole role : roleList) {
  48. authorities.add(new SimpleGrantedAuthority("ROLE_"+role.getName()));
  49. }
  50. for (TPermission permission : permissionList) {
  51. authorities.add(new SimpleGrantedAuthority(permission.getName()));
  52. }
  53. return new User(tAdmin.getLoginacct(), tAdmin.getUserpswd(), authorities);
  54. }
  55. }

6.对权限控制进行细粒度控制:(添加注解).

@EnableWebSecurity:开启 Spring Security 注解

@EnableGlobalMethodSecurity(prePostEnabled=true):开启全局的细粒度方法级别权限控制功能

 @PreAuthorize:方法执行前检查

hasRole是角色,hasAuthority是具体的操作,这两个都可以是多个,细粒度控制可以具体到每一个角色的具体操作步骤。动态的不影响项目代码的逻辑结构。

 

注意事项:

   在使用Springsecurity的细粒度控制时由于Springsecurity是被Spring扫描的,而controller是被SpringMVC扫描的,父不能访问子容器中的内容,所以细粒度注解不能生效,需要在web.xml中更改配置

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/436993
推荐阅读
相关标签
  

闽ICP备14008679号