SpringSecurity权限管理
SpringSecurity权限管理Security能做什么?用户认证:系统认为用户是否能够登录用户授权:系统判断用户是否有权力去做某些事情SpringSecurity特点:和Spring无缝整合全面的权限控制专门为web开发而设计重量级 需要引入各种依赖SpringSecurity基本原理:SpringSecurity本质上是一个过滤器链 包含很多个过滤器执行流程:配置DelegatingFil
·
SpringSecurity权限管理
Security能做什么?
用户认证:系统认为用户是否能够登录
用户授权:系统判断用户是否有权力去做某些事情
SpringSecurity特点:
- 和Spring无缝整合
- 全面的权限控制
- 专门为web开发而设计
- 重量级 需要引入各种依赖
SpringSecurity基本原理:
SpringSecurity本质上是一个过滤器链 包含很多个过滤器
执行流程:
- 配置DelegatingFilterProxy
- 执行doFilter
- initDelegate初始化
- String targetBeanName =this.getTargetBeanName 获取到内置过滤器FilterChainProxy
- doFilterInternal过滤器调用getFilters方法
- getFilters通过迭代器最终返回List<Filter>
- List<Filter>集合中加载了所有的过滤器
部分代码:
1.web.xml
<!--委派过滤器,用于整合其他框架--> <filter> <!--整合spring security时,此过滤器的名称固定springSecurityFilterChain--> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
2.SpringSecurityUserService
@Component public class SpringSecurityUserService implements UserDetailsService { @Reference private UserService userService; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { //通过用户名查找用户 com.aaa.pojo.User user = userService.findUserByUsername(username); if (user == null){ return null; } List<GrantedAuthority> list = new ArrayList<>(); Set<Role> roles = user.getRoles(); for (Role role : roles) { list.add(new SimpleGrantedAuthority(role.getKeyword())); Set<Permission> permissions = role.getPermissions(); for (Permission permission : permissions) { list.add(new SimpleGrantedAuthority(permission.getKeyword())); } } UserDetails userDetails = new User(username,user.getPassword(),list); return userDetails; } }
3.applicationContext-security.xml
<!--配置资源匿名访问--> <security:http security="none" pattern="/pages/login.html"></security:http> <security:http security="none" pattern="/css/**"></security:http> <security:http security="none" pattern="/img/**"></security:http> <security:http security="none" pattern="/js/**"></security:http> <security:http security="none" pattern="/plugins/**"></security:http> <!-- auto-config:自动配置,如果设置为true,表示自动应用一些默认配置,比如框架会提供一个默认的登录页面 use-expressions:是否使用spring security提供的表达式来描述权限 --> <security:http auto-config="true" use-expressions="true"> <security:headers> <!--设置在页面可以通过iframe访问受保护的页面,默认为不允许访问--> <security:frame-options policy="SAMEORIGIN"></security:frame-options> </security:headers> <!--配置拦截规则,/** 表示拦截所有请求--> <!-- pattern:描述拦截规则 asscess:指定所需的访问角色或者访问权限 --> <!--只要认证通过就可以访问--> <security:intercept-url pattern="/pages/**" access="isAuthenticated()" /> <!--如果我们要使用自己指定的页面作为登录页面,必须配置登录表单.页面提交的登录表单请求是由框架负责处理--> <!-- login-page:指定登录页面访问URL --> <security:form-login login-page="/pages/login.html" username-parameter="username" password-parameter="password" login-processing-url="/login.do" default-target-url="/pages/main.html" authentication-failure-url="/pages/login.html"></security:form-login> <!-- csrf:对应CsrfFilter过滤器 disabled:是否启用CsrfFilter过滤器,如果使用自定义登录页面需要关闭此项,否则登录操作会被禁用(403) --> <security:csrf disabled="true"></security:csrf> <!-- logout:退出登录 logout-url:退出登录操作对应的请求路径 logout-success-url:退出登录后的跳转页面 --> <security:logout logout-url="/logout.do" logout-success-url="/pages/login.html" invalidate-session="true"/> </security:http> <!--配置认证管理器--> <security:authentication-manager> <!--配置认证提供者--> <security:authentication-provider user-service-ref="springSecurityUserService"> <!--指定度密码进行加密的对象--> <security:password-encoder ref="passwordEncoder"></security:password-encoder> </security:authentication-provider> </security:authentication-manager> <!--配置密码加密对象--> <bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" /> <!--开启注解方式权限控制--> <security:global-method-security pre-post-annotations="enabled" /> <bean id="springSecurityUserService" class="com.aaa.service.SpringSecurityUserService"></bean>
权限管理经典数据库设计(5表、7表)
1.7表
2.5表
更多推荐
已为社区贡献1条内容
所有评论(0)