SpringBoot/Security动态管理用户、角色

使用spring Security3的四种方法概述那么在Spring Security3的使用中 , 有4种方法:

  1. 一种是全部利用配置文件 , 将用户、权限、资源(url)硬编码在xml文件中 , 已经实现过 , 并经过验证;
  2. 二种是用户和权限用数据库存储 , 而资源(url)和权限的对应采用硬编码配置 , 目前这种方式已经实现 , 并经过验证 。
  3. 三种是细分角色和权限 , 并将用户、角色、权限和资源均采用数据库存储 , 并且自定义过滤器 , 代替原有的FilterSecurityInterceptor过滤器 , 并分别实现AccessDecisionManager、InvocationSecurityMetadataSourceService和UserDetailsService , 并在配置文件中进行相应配置 。 目前这种方式已经实现 , 并经过验证 。 添加 Spring Security 配置类添加spring security到我们应用中第一步是要创建Spring Security Java 配置类 。 这个配置创建一个叫springSecurityFilterChain的Servlet过滤器 , 来对我们应用中所有的安全相关的事项(保护应用的所有url , 验证用户名密码 , 表单重定向等)负责 。
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;import org.springframework.security.config.annotation.web.builders.HttpSecurity;import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@Configuration@EnableWebSecuritypublic class SecurityConfiguration extends WebSecurityConfigurerAdapter {@AutowiredCustomSuccessHandler customSuccessHandler;@Autowiredpublic void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("bill").password("abc123").roles("USER");auth.inMemoryAuthentication().withUser("admin").password("root123").roles("ADMIN");auth.inMemoryAuthentication().withUser("dba").password("root123").roles("ADMIN","DBA");}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/", "/home").access("hasRole('USER')").antMatchers("/admin/**").access("hasRole('ADMIN')").antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')").and().formLogin().loginPage("/login").successHandler(customSuccessHandler).usernameParameter("ssoId").passwordParameter("password").and().csrf().and().exceptionHandling().accessDeniedPage("/Access_Denied");}}序: 本文使用springboot+mybatis+SpringSecurity 实现数据库动态的管理用户、角色、权限管理
本文细分角色和权限 , 并将用户、角色、权限和资源均采用数据库存储 , 并且自定义滤器 , 代替原有的FilterSecurityInterceptor过滤器 ,并分别实现AccessDecisionManager、InvocationSecurityMetadataSourceService和UserDetailsService , 并在配置文件中进行相应配置 。
spring security的简单原理:使用众多的拦截器对url拦截 , 以此来管理权限 。 但是这么多拦截器 , 笔者不可能对其一一来讲 , 主要讲里面核心流程的两个 。
首先 , 权限管理离不开登陆验证的 , 所以登陆验证拦截器AuthenticationProcessingFilter要讲; 还有就是对访问的资源管理吧 , 所以资源管理拦截器AbstractSecurityInterceptor要讲;
但拦截器里面的实现需要一些组件来实现 , 所以就有了AuthenticationManager、accessDecisionManager等组件来支撑 。
现在先大概过一遍整个流程 , 用户登陆 , 会被AuthenticationProcessingFilter拦截(即认证管理) , 调用AuthenticationManager的实现 , 而且AuthenticationManager会调用ProviderManager来获取用户验证信息(不同的Provider调用的服务不同 , 因为这些信息可以是在数据库上 , 可以是在LDAP服务器上 , 可以是xml配置文件上等) , 如果验证通过后会将用户的权限信息封装一个User放到spring的全局缓存SecurityContextHolder中 , 以备后面访问资源时使用 。访问资源(即授权管理) , 访问url时 , 会通过AbstractSecurityInterceptor拦截器拦截 , 其中会调用FilterInvocationSecurityMetadataSource的方法来获取被拦截url所需的全部权限 , 在调用授权管理器AccessDecisionManager , 这个授权管理器会通过spring的全局缓存SecurityContextHolder获取用户的权限信息 , 还会获取被拦截的url和被拦截url所需的全部权限 , 然后根据所配的策略(有:一票决定 , 一票否定 , 少数服从多数等) , 如果权限足够 , 则返回 , 权限不够则报错并调用权限不足页面 。
SpringBoot/Security动态管理用户、角色文章插图
重要本文目录: 1:数据库表设计 2:权限表的业务 3:springSecurity 配置修改 4:修改home.html 文件 5:修改HomeController.Java 文件 6:测试检验