- 浏览: 1543370 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (225)
- JAVA (27)
- Spring (49)
- Linux (51)
- JavaScript (8)
- Scrum (23)
- IDE (2)
- JSON (2)
- Solr (0)
- Webharvest (0)
- Hibernate (8)
- 杂谈 (3)
- Windows 7 (4)
- 持续集成 (23)
- tomcat (3)
- Android (1)
- SpringSecurity (11)
- Maven (9)
- jotm (3)
- C3P0 (1)
- Active Directory (2)
- cas (1)
- JQuery (2)
- ajax (1)
- plsql (2)
- nginx (4)
- apache (1)
- thrift (7)
- python (3)
- oracle (4)
- php (2)
- redis (1)
- fedora (1)
- windows7 (0)
- SVN (1)
- NFS (1)
- SAMBA (1)
- Atomikos (1)
- apache-poi (1)
- mysql (2)
- vncserver (1)
- mac (2)
- firefox (1)
- JIRA (1)
- p6spy (1)
- git (1)
- github (1)
- gitlab (1)
- gogs (1)
- Druid (1)
- MyBatis (1)
- docker (8)
- zabbix (1)
最新评论
-
lialatd:
您好,我用您的方法通过java api往jira系统中添加is ...
JIRA REST API ---- JAVA -
sprcen945:
可以了,是因为没加intercept-url 的拦截, 尼玛, ...
SpringSecurity3.X--Cas client 配置 -
sprcen945:
请问为什么我配了security.xml后切入点不起作用(之前 ...
SpringSecurity3.X--Cas client 配置 -
linxingyul:
根据楼主的代码 继承了WebMvcConfigurationS ...
SpringMVC4零配置--Web上下文配置【MvcConfig】 -
java_老头:
MvcConfig.java的FilterType.ANNOT ...
SpringMVC4零配置--Web上下文配置【MvcConfig】
目录
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
基本上都是这样配置,就不废话了。
<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.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/tool http://www.springframework.org/schema/tool/spring-tool-3.0.xsd http://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:bean class="org.springframework.security.access.vote.AuthenticatedVoter" /> <beans:bean class="com.piaoyi.common.security.DynamicRoleVoter" /> </beans:list> </beans:property> </beans:bean> </beans:beans>
UserService.java
public class UserService implements UserDetailsService{ @Autowired private ISystemUserService userService; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // TODO Auto-generated method stub SystemUser 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
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; } }
OK。
评论
daim6n@gmail.com
Map<String, Set<String>> urlAuths = authService.getUrlAuthorities();
loadUserAuthorities
authService
这两个哪里来的?
代码没有给完整,实际是自己定义的方法,如下
@Autowired
protected ISystemAuthorityService authService;
@Autowired
protected ISystemUserService userService;
/**
* 根据用户获取其相应的权限列表
*
* @param user
* 用户信息
* @return 权限列表
*/
protected Set<GrantedAuthority> loadUserAuthorities(SystemUser user) {
Set<SystemAuthority> sysauths = user.getAuthorities();
if (sysauths == null)
return null;
Set<GrantedAuthority> results = new HashSet<GrantedAuthority>();
for (Iterator<SystemAuthority> it = sysauths.iterator(); it.hasNext();) {
results.add(new GrantedAuthorityImpl(authService
.getAuthorityPrefix()
+ it.next().getId()));
}
return results;
}
Map<String, Set<String>> urlAuths = authService.getUrlAuthorities();
loadUserAuthorities
authService
这两个哪里来的?
发表评论
-
Druid学习笔记
2016-10-07 11:55 2522官方网站:https://github.com/aliba ... -
Spring Cache注解+Redis
2015-01-15 13:36 54528Spring3.1 Cache注解 依赖jar包: ... -
Spring Cache注解+Memcached
2015-01-12 16:11 20503Spring3.1 Cache注解 依赖jar包: ... -
Spring4+Hibernate4+Atomikos3.3多数据源事务管理
2014-09-25 10:46 8430Spring3+后不再对JTOM提供支持,所以可以改用At ... -
SpringMVC4零配置--Web上下文配置【MvcConfig】
2014-09-10 18:22 73505与SpringSecurity的配置类似,spring同样 ... -
SpringMVC4零配置--SpringSecurity相关配置【SpringSecurityConfig】
2014-09-10 18:22 72046SpringSecurity的配置相对来说有些复杂,如果 ... -
SpringMVC4零配置--应用上下文配置【AppConfig】
2014-09-10 18:21 26611从spring3.0开始,Spring将JavaConfi ... -
SpringMVC4零配置--web.xml
2014-09-10 18:21 98772servlet3.0+规范后,允许servlet,filt ... -
SpringMVC4零配置
2014-09-05 19:11 90053基于Servlet3.0规范和SpringMVC4注解式配 ... -
SpringSecurity3.X--SpEL 表达式
2014-07-17 10:03 3036使用 Spring 表达式语言配置访问控制,要实现这一功能 ... -
SpringSecurity3.X--LDAP:AD配置
2014-07-08 17:08 5588前面介绍过基于本地数据库验证的方式,参考http://ha ... -
Thrift--JSClient
2013-09-26 14:45 6022thrift提供了基于jquery--ajax的客户端调用 ... -
Thrift--Spring集成ThriftServlet
2013-09-25 11:42 11165Thrift除了可以通过TCP协议访问,还可以通过HTTP ... -
Thrift转SpringHttpInvoker
2013-09-24 13:26 1808关于在spring中集成Thrift请参看:http://h ... -
Spring集成Thrift--Server AND Client
2013-09-04 20:13 13795Thrift网上有N多教程, ... -
C3P0配置实战
2012-09-04 18:34 51942C3P0: 一个开源的JDBC连接池,它实现了数据源和JN ... -
spring+jotm 多数据源事务管理(三)JNDI+Tomcat
2012-06-07 16:27 5318spring+jotm 多数据源事务管理系列 spr ... -
spring+jotm 多数据源事务管理(二)hibernate
2012-06-07 11:20 2921spring+jotm 多数据源事务管理系列 spr ... -
spring+jotm 多数据源事务管理(一)jdbc
2012-06-07 11:00 5316spring+jotm 多数据源事务管理系列 spr ... -
SpringSecurity3.X--Cas client 配置之配置session-management遇到的问题(2)
2011-10-27 14:19 2166关于“SpringSecurity3.X--Cas clien ...
相关推荐
A.3. ACL表 A.3.1. Hypersonic SQL A.3.1.1. PostgreSQL B. 安全命名空间 B.1. Web应用安全 - 元素 B.1.1. 属性 B.1.1.1. servlet-api-provision B.1.1.2. path-type B.1.1.3. lowercase-comparisons B....
总的来说,"spring-security-4.0.3.RELEASE-全包"是一个完整的Spring Security版本集合,为开发者提供了全面的工具和类库,以便在Java项目中实现安全、灵活的身份验证和授权管理。无论你是新手还是经验丰富的开发者...
Spring Framework是Java领域的一个重量级框架,它为构建企业级应用提供了全面的解决方案,包括依赖注入(DI)、面向切面编程(AOP)、数据访问/集成、Web 应用开发等。而Commons Logging则是Apache软件基金会提供的...
4.3.12.RELEASE 版本是 Spring Framework 的一个重要版本,它在4.3.x系列中的稳定性得到了广泛认可。这个版本包含了自4.3.0发布以来的所有更新、修复和增强,确保了开发者能够使用最新的功能和安全补丁。 在Spring ...
Spring Security 2.0.x 是一个重要的版本,它引入了许多新特性,同时也修复了一些已知的问题。对于想要了解具体版本信息的用户,可以通过官方文档或GitHub等渠道获取更详细的发布说明。 **1.4. 获得源代码** 用户...
总之,这个实战学习笔记涵盖了SpringBoot 3.x与SpringSecurity 6.x的集成,以及如何构建一个适应生产环境的安全系统。通过学习和实践,你可以掌握如何利用这些工具设计和实现多账号登录、分离的数据库设计、精细的...
3. **Spring Boot集成**:Spring 5与Spring Boot 2.x版本有更好的兼容性,使得基于Spring Boot的微服务开发更加便捷,自动配置功能让应用程序的启动和运行更为简单。 4. **Kotlin支持**:Spring 5全面支持Kotlin,...
Spring作为一个轻量级、全面的Java应用程序框架,为开发者提供了众多强大的功能,包括依赖注入(DI)、面向切面编程(AOP)、数据访问集成(DAO)以及与多种技术如Hibernate、Struts的集成。本章内容可能包括以下几...
Spring Framework是Java开发领域中最广泛使用的轻量级框架之一,其4.3.10.RELEASE版本是一个稳定且功能丰富的版本。这个版本包含了对先前版本的改进和修复,旨在提高性能、增强安全性,并提供更好的开发者体验。让...
《精通Spring 2.x - 企业应用开发详解》是一本深度解析Spring框架2.x版本的专业书籍,本章节主要聚焦在Spring在企业级应用中的实际运用和技术细节。在Spring 2.x时代,它已经成为了Java EE(当时称为J2EE)开发的...
本实例将基于JDK 1.7和Maven的阿里镜像来创建一个简单的Spring Security应用,以演示其基本功能。 ### 1. 安装与配置 首先,确保你的开发环境已经安装了JDK 1.7,并配置了Maven。由于国内网络原因,推荐将Maven的...
Spring Security提供了一个InMemoryTokenRepositoryImpl的简单实现,但通常建议使用数据库存储,如JdbcTokenRepositoryImpl。 ```java @Bean public PersistentTokenRepository persistentTokenRepository() { ...
10. **Spring Security**:尽管可能不是Spring 2.x的主要内容,但Spring Security(以前称为Acegi Security)是一个强大的安全框架,可用于认证、授权和访问控制。 综上所述,该章节可能详细讲解了Spring在实际项目...
本压缩包包含了两份重要的SpringSecurity中文文档,分别为“Spring Security安全权限管理手册.CHM”和“Spring Security 3.x Reference__Robin收集整理制作(fastzch@gmail.com).chm”。 “Spring Security安全权限...
Spring Security 是一个强大的安全框架,用于保护基于 Java 的应用程序,包括 Web 应用。在 Spring Security 5.x 版本中,它提供了对多种密码加密方式的兼容性,以适应不同场景下的安全性需求。本文将深入探讨如何在...
- **Web应用**:Spring MVC提供了一个灵活的模型-视图-控制器(MVC)实现,适用于构建动态网站。 - **微服务架构**:Spring Boot简化了基于Spring的微服务应用的开发过程。 **4. 依赖管理和命名约定** - **Spring...
Spring LDAP是Spring框架的一个扩展,专门用于处理 Lightweight Directory Access Protocol (LDAP) 的应用程序开发。它将Spring的编程模型引入了目录服务,提供了简单、强大的接口来操作LDAP数据。在Spring LDAP ...