spring之使用Spring Security实现权限管理

转载: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;  }  
}  






本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iNeuOS工业互联网操作系统,提升分布式云端控制安全策略和增加实时日志功能...

目 录1. 概述... 22. 平台演示... 23. 云端控制策略和应用过程... 23.1 云端控制策略... 23.2 控制应用过程... 34. 实时日志... 71. 概述这次升级主要提升云端控制的安全策略&#xff0c;不管公有云部署或是私有云部署&#…

直男的回答能多出乎意料?

1 我家的鸭子没这么扁&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 这个回答&#xff0c;妙啊...&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 强迫症犯人要求判10年▼4 像羊又像猫&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼5 美女…

Angularjs调用公共方法与共享数据

这个问题场景是在使用ionic开发页面的过程中发现&#xff0c;多个页面对应的多个controller如何去调用公共方法&#xff0c;比如给ionic引入了toast插件&#xff0c;如何将这个插件的调用变成公共方法或者设置成工具类&#xff0c;因为在每个controller中直接注入这个toast插件…

mysql去掉两个最高分_数据分析系列 16/32 | MySQL中子查询与联合查询

前面说了很多MySQL中的查询&#xff0c;比如条件查询、分组聚合查询、连接查询&#xff0c;今天来说一下另外两个非常的重要的查询&#xff0c;MySQL中的子查询和联合查询。PART01子查询子查询也称嵌套查询&#xff0c;是将一个查询语句嵌套在另一个查询语句的WHERE子句或者HAV…

那些不回你微信的人都在看什么?

如何成为一个“聊得开”的人&#xff1f;如何丰富空闲时光&#xff1f;如何在短时间内获取最最专业的文化、艺术资讯&#xff1f;小编给大家推荐几个公众号它们有趣有颜有料长按二维码&#xff0c;选择“识别图中二维码”关注印客美学id&#xff1a;inkbetter△长按二维码“识别…

按照学号查找学生_[源码和文档分享]基于JAVA和MYSQL数据库的学生成绩管理系统...

一、需求分析本系统是学生成绩管理系统&#xff0c;所以应该做到可以录入学生成绩&#xff0c;修改学生成绩&#xff0c;删除学生成绩&#xff0c;查询学生成绩&#xff0c;以及最后的所有学生按照GPA排名。本系统的数据来源期末考试成绩&#xff0c;用来实现录入&#xff0c;查…

颜宁问4对科研夫妻:男科学家怎样平衡事业家庭?

全世界只有3.14 % 的人关注了爆炸吧知识本文来源&#xff1a;科学网网上很多人一说到我&#xff0c;就说颜宁之所以能成功&#xff0c;因为她是单身&#xff0c;没有家庭拖累。但事实上&#xff0c;有家庭、有事业才是绝大多数人的现状。我们这次请来四对科研伉俪&#xff0c;不…

WebService学习笔记---CXF入门

2019独角兽企业重金招聘Python工程师标准>>> 一、准备 软件环境&#xff1a; JDK1.8, Eclipse JEE 4.4, Maven-3.2.5, Spring-4, CXF-3.1.5 二、创建项目 新建一个Maven项目&#xff0c;在pom.xml里添加spring依赖<dependencyManagement><dependencies>…

.NET 6新特性试用 | ArgumentNullException卫语句

前言在前面的文章中&#xff08;《可空引用类型》&#xff09;&#xff0c;我们介绍过编译器会帮我们检查空引用&#xff0c;但是仅仅是警告。最好的方式还是在运行时用卫语句进行检查&#xff1a;private void Test(WeatherForecast weatherForecast) {if (weatherForecast n…

JSP之EL表达式详细介绍

一、JSP EL语言定义 E L&#xff08;Expression Language&#xff09; 目的&#xff1a;为了使 JSP写起来更加简单。 表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言&#xff0c;它提供了在 JSP 中简化表达式的方法。它是一种简单的语言&#xff0c;基于可用的命名空…

那一年,爱因斯坦输得很惨很惨,被十几个诺奖得主怼了一遍后,退出了群聊……...

全世界只有3.14 % 的人关注了爆炸吧知识科学家撕逼原来这么刺激“遇事不决&#xff0c;量子力学”&#xff0c;作为长期在民间被调侃的学科&#xff0c;量子力学的名声不小&#xff0c;但它究竟有多重要&#xff0c;又是怎么来的&#xff0c;却少有人了解。而说到量子力学&…

带有帐号密码验证的apche服务器文件下载

2019独角兽企业重金招聘Python工程师标准>>> 使用python访问 #!/usr/bin/python #fileencoding:utf-8def testUrl():import urllib2import sysimport reimport base64from urlparse import urlparse#下载路径theurl http://ip/release/LHJH/Server/er_service.waru…

使用keytool查看Android APK签名

文章目录 一、找到JDK位置二、使用方法2.1 打开windows命令行工具2.2 查看签名 三、如何给APK做系统签名呢? 一、找到JDK位置 安卓AS之后&#xff0c;可选择继续安装JDK&#xff0c;如本文使用amazon版本默认位置&#xff1a;C:\Users\66176.jdks\corretto-1.8.0_342可通过自…

exchange服务器维护模式命令,Exchange服务器系列课程之七--维护邮件服务器(二)

继续上次的讨论&#xff0c;上次讨论了邮件服务器的一些监控和排错手段&#xff0c;今天我们继续来讨论邮件服务器的维护。今天主要来讨论一下邮件服务器的备份与还原。为什么要备份我就不多说了&#xff0c;备份的方法也非常简单&#xff0c;通过备份工具直接备份就可以了。这…

任务管理器在右下角的图标不显示

任务管理器在右下角的图标不显示 2012年11月7日18:22:23 症状如下图所示&#xff0c;不管是打开任务管理器还是最小化它&#xff0c;右下角均没有它的图标。 网上查到的说法均不靠谱。后来我CtrlAltDel调出任务管理器&#xff0c;找到任务管理器对应进程“taskmgr.exe”&#x…

MAUI中构建跨平台原生控件实现

简介MAUI中使用Handler体系来处理不同平台的原生控件实现, 即对应的, 如果我们想要创建控件, 只需要创建基于不同平台的Handler即可。那么下面主要教大家如何通过创建Handler(事件处理程序)来构建自己的控件。开始下面, 将通过创建一个进度条控件案例, 来演示如何在MAUI项目中创…

Android之android studio如何获取证书指纹 (SHA1)

android studio如何获取证书指纹 (SHA1) 为什么要用SHA1 我们做百度地图或是高德地图的时候。注册app信息要求填写数字签名 我们可以通过外部命令行获取&#xff0c;也可以通过eclipse获取 &#xff0c;现在主流是android studio下面是通过Android studio获取的方法 第一步&am…

排位重要还是媳妇儿重要?

1 刚打到的车&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 还是排位要紧&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 大叔为求省事在家自行焚烧床垫▼4 好家伙&#xff0c;这回答直呼&#xff1a;想不到吧&#xff01;&#xff08;素材来源网络&…

锁屏快捷键_全面屏 iPhone 锁屏快捷键美化,让你的 iPhone 更特别

苹果从iPhone X以后的手机都是全面屏(即刘海屏)&#xff0c;在你的全面屏手机锁屏状态在&#xff0c;屏幕下方有两个快捷按钮&#xff0c;左边的是「手电筒」&#xff0c;右边的是「相机」&#xff0c;在锁屏状态下这两个功能是圆形的&#xff0c;今天堂堂分享一个无需越狱即可…

URLEncode编码和URLDecode解码

1 String text1 java.net.URLEncoder.encode("中国" ,"utf-8" ); 2 String text2 java.net.URLDecoder.decode(text1,"utf-8"); (1).URLEncoder需要注意&#xff1a;这个方法编码了符号&#xff0c;“\” ,“&”,“”,和“&#xff1…