转载:http://hanqunfeng.iteye.com/blog/1155226

目录

SpringSecurity3.X--一个简单实现

SpringSecurity3.X--前台与后台登录认证

SpringSecurity3.X--remember-me

SpringSecurity3.X--验证码

作者对springsecurity研究不深,算是个初学者吧,最近很不完整的看了一下翻译的很是生硬的《Spring3Security-3.0.1中文官方文档.pdf》,为了便于学习和记忆,所以将所学知识在此记录下来。

这里给出一个简单的安全验证的实现例子,先说一下需求:

1.通过登录页面进行登录

2.用户登录前访问被保护的地址时自动跳转到登录页面

3.用户信息存储在数据表中

4.用户权限信息存在在数据表中

5.用户登录成功后访问没有权限访问的地址时跳转到登录页面

ok,以上就是一个基本的需求了,大部分的系统都是基于该需求实现登录模块的。

给出实现之前,先简单说明一下springsecurity的原理,

1.AccessDecisionManager

和我们一般实现登录验证采用filter的方式一样,springsecurity也是一个过滤器,当请求被springsecurity拦截后,会先对用户请求的资源进行安全认证,如果用户有权访问该资源,则放行,否则将阻断用户请求或提供用户登录,

在springsecurity中,负责对用户的请求资源进行安全认证的是AccessDecisionManager,它就是一组投票器的集合,默认的策略是使用一个AffirmativeBased,既只要有一个投票器通过验证就允许用户访问,

所以如果希望实现自己的权限验证策略,实现自己的投票器是一个很好的选择。

2.UserDetailsService

如果用户没有登录就访问某一个受保护的资源,则springsecurity会提示用户登录,用户登录后,由UserDetailsService来验证用户是否合法,既验证用户名和密码是否正确,同时验证用户是否具备相应的资源权限,

即对应的access的value。

如果用户验证通过,则由AccessDecisionManager来决定是否用户可以访问该资源。

下面给出具体实现:

web.xml

基本上都是这样配置,就不废话了。

Xml代码 

<filter>  <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>  

applicationContext-security.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:tool="http://www.springframework.org/schema/tool" xmlns:beans="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsdhttp://www.springframework.org/schema/tool http://www.springframework.org/schema/tool/spring-tool-3.0.xsdhttp://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"default-lazy-init="true"><!-- 不需要进行认证的资源,3.0之后才改为这样配置 --><http security="none" pattern="/index.do" /><!-- 因为要使用自己的权限验证规则,所以这里要配置access-decision-manager-ref实际上,我只是在accessDecisionManager中增加了一个投票器,其它的属性都比较简单,不多说了 --><http auto-config='true' access-decision-manager-ref="accessDecisionManager"access-denied-page="/index.do"><intercept-url pattern="/demo.do*" access="IS_AUTHENTICATED_REMEMBERED" /><intercept-url pattern="/**/*.do*" access="HODLE" /><logout logout-url="/logout.do" invalidate-session="true"logout-success-url="/logout.jsp" /><form-login login-page="/index.do" default-target-url="/frame.do"always-use-default-target="true" authentication-failure-url="/index.do?login_error=1" /><session-management><concurrency-control max-sessions="1" /></session-management></http><!-- Automatically receives AuthenticationEvent messages --><beans:bean id="loggerListener"class="org.springframework.security.authentication.event.LoggerListener" /><!-- 认证管理器,使用自定义的UserDetailsService,并对密码采用md5加密--><authentication-manager><authentication-provider user-service-ref="userService"><password-encoder hash="md5" /></authentication-provider></authentication-manager><beans:bean id="userService" class="com.piaoyi.common.security.UserService" /><!-- 访问决策管理器,这里使用AffirmativeBased,并加入一个自定义的投票器DynamicRoleVoter --><beans:bean id="accessDecisionManager"class="org.springframework.security.access.vote.AffirmativeBased"><beans:property name="decisionVoters"><beans:list><beans:bean class="org.springframework.security.access.vote.RoleVoter" /><beans:beanclass="org.springframework.security.access.vote.AuthenticatedVoter" /><beans:bean class="com.piaoyi.common.security.DynamicRoleVoter" /></beans:list></beans:property></beans:bean>
</beans:beans>

UserService.java

Java代码  
public class UserService implements UserDetailsService{@Autowiredprivate ISystemUserService userService;@Overridepublic UserDetails loadUserByUsername(String username)throws UsernameNotFoundException {// TODO Auto-generated method stubSystemUser user = userService.findById(username);      if (user == null)throw new UsernameNotFoundException("The user name " + username+ " can not be found!");List<GrantedAuthority> resultAuths = new ArrayList<SystemAuthority>();//增加access中配置的权限,实际上这里就是让所有登陆用户都具备该权限,//而真正的资源权限验证留给AccessDecisionManager来决定resultAuths.add(new GrantedAuthorityImpl("HODLE"));//验证用户名和密码是否正确,以及是否权限正确return new User(username, user.getPassword().toLowerCase(), user.isStatus(), true,true, true, resultAuths);}
}

DynamicRoleVoter.java

Java代码
public class DynamicRoleVoter  implements  AccessDecisionVoter {  @Autowired  private ISystemUserService userService;  private PathMatcher pathMatcher = new AntPathMatcher();  /* * (non-Javadoc) *  * @see * org.springframework.security.vote.AccessDecisionVoter#supports(java.lang * .Class) */  @SuppressWarnings("unchecked")  public boolean supports(Class clazz) {  return true;  }  /* * (non-Javadoc) *  * @seeorg.springframework.security.vote.AccessDecisionVoter#supports(org. * springframework.security.ConfigAttribute) */  public boolean supports(ConfigAttribute attribute) {  return true;  }  /* * (non-Javadoc) *  * @seeorg.springframework.security.vote.AccessDecisionVoter#vote(org. * springframework.security.Authentication, java.lang.Object, * org.springframework.security.ConfigAttributeDefinition) */  public int vote(Authentication authentication, Object object,  java.util.Collection arg2) {  int result = ACCESS_ABSTAIN;  if (!(object instanceof FilterInvocation))  return result;  FilterInvocation invo = (FilterInvocation) object;  String url = invo.getRequestUrl();//当前请求的URL  Set<GrantedAuthority> authorities = null;  String userId = authentication.getName();  //获得当前用户的可访问资源,自定义的查询方法,之后和当前请求资源进行匹配,成功则放行,否则拦截      authorities = loadUserAuthorities(userService.findById(userId));  Map<String, Set<String>> urlAuths = authService.getUrlAuthorities();  Set<String> keySet = urlAuths.keySet();  for (String key : keySet) {  boolean matched = pathMatcher.match(key, url);  if (!matched)  continue;  Set<String> mappedAuths = urlAuths.get(key);  if (contain(authorities, mappedAuths)) {  result = ACCESS_GRANTED;  break;  }  }  return result;  }  protected boolean contain(Set<GrantedAuthority> authorities,  Set<String> mappedAuths) {  if (CollectionUtils.isEmpty(mappedAuths)  || CollectionUtils.isEmpty(authorities))  return false;  for (GrantedAuthority item : authorities) {  if (mappedAuths.contains(item.getAuthority()))  return true;  }  return false;  }
}  

spring之使用Spring Security实现权限管理相关推荐

  1. Spring Boot实现简单的用户权限管理(超详细版)

    2020-11-21 更新:解决由于.yml文件引起的数据库链接问题 文章目录 一.前言 二.项目环境 三.项目文件结构 四.项目代码 数据库连接配置 1.Entity层 2.dao层 3.servi ...

  2. Spring Boot项目学习之通用权限管理项目01

    权限管理系统是一个十分常见的系统,在这个系统中是基于角色访问控制的,用户是通过角色与权限进行关联.换句话说,就是一个用户拥有若干个角色,每一个角色拥有若干权限,这样就可以形成一个关系模型:用户-角色- ...

  3. springBoot整合spring security+JWT实现单点登录与权限管理前后端分离

    在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与权限管理. ...

  4. springBoot整合spring security+JWT实现单点登录与权限管理前后端分离--筑基中期

    写在前面 在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与 ...

  5. 如何在 Spring Boot 中用 Shiro 实现权限管理

    本行 Chat 内容包括: 简单介绍 IntelliJ IDEA 的安装与注册 什么是 Spring Boot? 如何通过 IDEA 创建一个简单的 Spring Boot 项目 Apache Shi ...

  6. Spring Security 中最流行的权限管理模型!

    前面和大家说了 ACL,讲了理论,也给了一个完整的案例,相信小伙伴们对于 ACL 权限控制模型都已经比较了解了. 本文我要和大家聊一聊另外一个非常流行的权限管理模型,那就是 RBAC. 1.RBAC ...

  7. Spring Security基于角色的权限管理

    1.Spring Security 1.1核心领域概念 认证(Authentication):认证是建立主体(principal)的过程. 主体通常是指在应用程序中执行操作的用户.设备或其他系统 授权 ...

  8. 基于Spring Security 的Java SaaS应用的权限管理

    1. 概述 权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源.资源包括访问的页面,访问的数据等,这在传统的应用系统中比较常见.本文介绍的则是基于Saas系统 ...

  9. Spring Security + JWT实现权限管理

    1 写在之前 本博客主要使用Spring Boot 整合Spring Security + JWT实现权限管理,利用JWT工具生成token,返回给登录接口.在访问其他接口时,采用Bearer Tok ...

最新文章

  1. mysql 代替不明_mysql不明原因停止后不能启动,请高手分析
  2. uniapp原生子窗体(弹出层为例子)
  3. Xen 工作原理与体系架构
  4. 显卡A卡和N卡有什么区别
  5. BZOJ3064 CPU监控
  6. 现代图论笔记(二)树与二分图
  7. 自然语言处理十大应用
  8. 8类网线利弊_八类网线用过吗?与超五类、六类等网线有啥区别?
  9. 1-3 Python基本数据类型
  10. 脸谱网下载_脸谱网对AR眼镜大胆愿景的最大障碍是信任
  11. word中 数字或者字母间距 突然变大
  12. Mac OS X系统下修改wifi共享的默认网段
  13. 半群 群 阿贝尔群 环 整数环 多项式环
  14. 纵观 Excel 演化史,开发者如何通过“表格技术”提升企业生产力
  15. make XXX_defconfig 分析
  16. mysql longtext_MySql中LongText类型大字段查询优化
  17. 二、八、十、十六进制之间的转换
  18. android 刷机 zip,安卓自制zip刷机包 zip包刷机脚本函数详细例举教程
  19. 物联网安全的发展现状与展望
  20. 【2020-MOOC-浙江大学-陈越、何钦铭-数据结构】春期中考试(附每一个题目的详细解析)

热门文章

  1. NLog源码解读——StringBuilderPool
  2. 为WPF播放GIF伤神不?
  3. 牛气!.NET5电商平台轻松承接10亿GMV,只因做对了这个!
  4. 深度解读.NET 5授权中间件的执行策略
  5. 基于.NET Core的优秀开源项目合集
  6. 你有把依赖注入玩坏?
  7. 使用BeetleX.ESDoc构建文档搜索功能
  8. C#小游戏—钢铁侠VS太空侵略者
  9. .NET Core 3.0之深入源码理解HealthCheck(一)
  10. 程序员修神之路--做好分库分表其实很难之二