- 浏览: 263472 次
- 性别:
- 来自: 苏州
-
文章分类
- 全部博客 (289)
- java (72)
- oracle (3)
- mysql (5)
- spring (28)
- hibernate (2)
- osgi (0)
- linux (2)
- ExtJs (1)
- jvm (0)
- mybatis (7)
- 分布式 (11)
- MINA (6)
- apache+tomcat (13)
- js+htm (7)
- android (44)
- http (1)
- hbase+hdoop (0)
- memcache (13)
- search (27)
- 部署及性能 (12)
- mongoDB (2)
- 多线程 (12)
- 安全管理验证 (9)
- struts (1)
- webservice (0)
- easyUI (1)
- spring security (16)
- pattern (6)
- 算法 (2)
最新评论
-
lzh8189146:
CommonsHttpSolrServer这个类,现在是不是没 ...
CommonsHttpSolrServer -
xiaochanzi:
我按照你的方法试了下,tomcat6可以发布,但是访问任何网页 ...
基于内嵌Tomcat的应用开发 -
phoneeye:
麻烦你,如果是抄来的文章,请给出来源。谢谢
ant 两则技巧 -
neverforget:
转载不注明出处
Spring Security3.1登陆验证 替换 usernamepasswordfilter -
liang1022:
若不使用eclipse ,如何在命令行下 运行服务端程序 ?
WebService CXF学习(入门篇2):HelloWorld
先在web.xml 中配置一个过滤器(必须在Struts的过滤器之前)
- <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>
然后就是编写Spring安全的配置文件applicationContext-security.xml并配置到Spring解析的路径下
Spring Security主要做两件事,一件是认证,一件是授权。
认证
当用户访问受保护的信息却没有登录获得认证时,框架会自动将请求跳转到登录页面在http标签中的
- <form-login login-page="/page/login.jsp" />
配置。且该登录页面必须是不被拦截的。故要配置上
- <intercept-url pattern="/page/login.jsp" filters="none" />
Web项目的认证如果在HTTP标签中配置了auto-config="true",框架就会自动的配置多8?个拦截器。 默认表单登录认证的是FORM_LOGIN_FILTER拦截器,我们可以直接写自定义的UserDetailsService,在这个类中实现方法UserDetails loadUserByUsername(String username),从数据库获取用户信息,以及其拥有的角色。
- @Service("myUserDetailsService")
- public class MyUserDetailsServiceImpl extends BaseService implements UserDetailsService {
- @Resource
- private UserDao userDao;
- public UserDetails loadUserByUsername(String username)
- throws UsernameNotFoundException, DataAccessException {
- User user = userDao.getUserByUsername(username);
- List<Role> roles = user.getRoles();
- Collection<GrantedAuthority> authorities = new LinkedList<GrantedAuthority>();
- for (Role role : roles) {
- authorities.add(new GrantedAuthorityImpl(role.getCode()));
- }
- UserDetails userDetails = new org.springframework.security.core.userdetails.User(username,user.getPassword(),Constants.STATE_VALID.equals(user.getState()),true,true,true,authorities);
- return userDetails;
- }
- }
配置在
- <authentication-manager alias="myAuthenticationManager">
- <authentication-provider user-service-ref="myUserDetailsService">
- <password-encoder hash="md5" />
- </authentication-provider>
- </authentication-manager>
如果需要在登录的时候,在HTTP SESSION中配置做些操作的。就得配置自定义的FORM_LOGIN_FILTER了
在HTTP标签中加入
- <custom-filter ref="loginFilter" before="FORM_LOGIN_FILTER" />
并配置
- <!-- 访问控制验证器Authority -->
- <beans:bean id="securityFilter"
- class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
- <beans:property name="authenticationManager" ref="myAuthenticationManager" />
- <beans:property name="accessDecisionManager"
- ref="affirmativeBasedAccessDecisionManager" />
- <beans:property name="securityMetadataSource" ref="mySecurityMetadataSource"/>
- </beans:bean>
MyUsernamePasswordAuthenticationFilter 类是这么写的
- public class MyUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter{
- public static final String USERNAME = "username";
- public static final String PASSWORD = "password";
- @Resource
- private LoginService loginService;
- private UserLoginFormBean userLoginFormBean = new UserLoginFormBean();
- @Resource
- private LogService logService;
- @Override
- public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
- String username = obtainUsername(request);
- String password = obtainPassword(request);
- HttpSession session = request.getSession();
- userLoginFormBean.setUsername(obtainUsername(request));
- userLoginFormBean.setPassword(obtainPassword(request));
- User user = loginService.login(userLoginFormBean);
- session.setAttribute(Constants.SESSION_USER, user);
- Log log = new Log(user,getIpAddr(request),"用户登录", null);
- logService.add(log);
- //UsernamePasswordAuthenticationToken实现 Authentication
- UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
- // Place the last username attempted into HttpSession for views
- // 允许子类设置详细属性
- setDetails(request, authRequest);
- // 运行UserDetailsService的loadUserByUsername 再次封装Authentication
- return this.getAuthenticationManager().authenticate(authRequest);
- }
- }
getAuthenticationManager().authenticate(authRequest)是为了让UserDetailService提供Detailed的信息并认证
授权
在授权时,系统默认通过FILTER_SECURITY_INTERCEPTOR认证。
如需自定义授权拦截器,我们在HTTP中在默认授权拦截器前配置了自定义的拦截器
- <custom-filter ref="securityFilter" before="FILTER_SECURITY_INTERCEPTOR" />
本平台采用基于请求URL地址的验证方式
securityFilter的配置如下
- <!-- 访问控制验证器Authority -->
- <beans:bean id="securityFilter"
- class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
- <beans:property name="authenticationManager" ref="myAuthenticationManager" />
- <beans:property name="accessDecisionManager"
- ref="affirmativeBasedAccessDecisionManager" />
- <beans:property name="securityMetadataSource" ref="mySecurityMetadataSource"/>
- </beans:bean>
采用默认的自定义的也是采用Spring默认的FilterSecurityInterceptor拦截器,accessDecisionManager也采用的是框架提供的affirmativeBasedAccessDecisionManager
采用投票者来判断是否授权。
- <beans:bean id="affirmativeBasedAccessDecisionManager"
- class="org.springframework.security.access.vote.AffirmativeBased">
- <beans:property name="decisionVoters" ref="roleDecisionVoter" />
- </beans:bean>
- <beans:bean name="roleDecisionVoter"
- class="org.springframework.security.access.vote.RoleVoter" />
- <beans:bean id="mySecurityMetadataSource"
- class="org.springframework.security.web.access.intercept.DefaultFilterInvocationSecurityMetadataSource">
- <beans:constructor-arg
- type="org.springframework.security.web.util.UrlMatcher" ref="antUrlPathMatcher" />
- <beans:constructor-arg type="java.util.LinkedHashMap"
- ref="securityRequestMapFactoryBean" />
- </beans:bean>
SecurityMetadataSource也是ss web框架提供的DefaultFilterInvocationSecurityMetadataSource,只是初始化参数中,一个选择antUrl匹配,还是正则匹配,另一个是提供自定义的通过securityRequestMapFactoryBean。在后者是一个LinkedHashMap<RequestKey, Collection<ConfigAttribute>>类型,就是每一个URL匹配模式,所需要角色的集合。
- @Service("securityRequestMapFactoryBean")
- public class SecurityRequestMapFactoryBean extends
- LinkedHashMap<RequestKey, Collection<ConfigAttribute>> {
- @Resource
- private ModuleDao moduleDao;
- @PostConstruct
- public void loadSecurityInfos(){
- List<Module> modules = moduleDao.getAll(new Module());
- // List<Role> roles = roleDao.getAll(new Role());
- for (Module module : modules) {
- RequestKey requestKey = new RequestKey(module.getPageUrl());
- Collection<ConfigAttribute> configAttributes = new LinkedList<ConfigAttribute>();
- for (final Role role : module.getRoles()) {
- configAttributes.add(new ConfigAttribute() {
- public String getAttribute() {
- return role.getCode();
- }
- });
- }
- this.put(requestKey, configAttributes);
- }
- }
- }
PS: 最终的件applicationContext-security.xml配置文件
- <pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
- <beans:beans xmlns="http://www.springframework.org/schema/security"
- xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">
- <http auto-config="true">
- <intercept-url pattern="/page/login.jsp" filters="none" />
- <intercept-url pattern="/LoginAction*" filters="none" />
- <intercept-url pattern="/common/**" filters="none" />
- <intercept-url pattern="/css/**" filters="none" />
- <intercept-url pattern="/common/**" filters="none" />
- <intercept-url pattern="/images/**" filters="none" />
- <intercept-url pattern="/js/**" filters="none" />
- <form-login login-page="/page/login.jsp" />
- <custom-filter ref="loginFilter" before="FORM_LOGIN_FILTER" />
- <custom-filter ref="securityFilter" before="FILTER_SECURITY_INTERCEPTOR" />
- </http>
- <!-- 访问控制验证器Authority -->
- <beans:bean id="securityFilter"
- class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
- <beans:property name="authenticationManager" ref="myAuthenticationManager" />
- <beans:property name="accessDecisionManager"
- ref="affirmativeBasedAccessDecisionManager" />
- <beans:property name="securityMetadataSource" ref="mySecurityMetadataSource"/>
- </beans:bean>
- <!-- 登录验证器Authentication -->
- <beans:bean id="loginFilter"
- class="com.epro.crm.util.security.MyUsernamePasswordAuthenticationFilter">
- <!-- 处理登录的action -->
- <beans:property name="filterProcessesUrl" value="/SecurityCheck" />
- <!-- 验证成功后的处理-->
- <beans:property name="authenticationSuccessHandler"
- ref="loginLogAuthenticationSuccessHandler" />
- <!-- 验证失败后的处理-->
- <beans:property name="authenticationFailureHandler"
- ref="simpleUrlAuthenticationFailureHandler" />
- <beans:property name="authenticationManager" ref="myAuthenticationManager" />
- <!-- 注入DAO为了查询相应的用户 -->
- <beans:property name="loginService" ref="loginService" />
- <beans:property name="logService" ref="logService" />
- </beans:bean>
- <authentication-manager alias="myAuthenticationManager">
- <authentication-provider user-service-ref="myUserDetailsService">
- <password-encoder hash="md5" />
- </authentication-provider>
- </authentication-manager>
- <beans:bean id="mySecurityMetadataSource"
- class="org.springframework.security.web.access.intercept.DefaultFilterInvocationSecurityMetadataSource">
- <beans:constructor-arg
- type="org.springframework.security.web.util.UrlMatcher" ref="antUrlPathMatcher" />
- <beans:constructor-arg type="java.util.LinkedHashMap"
- ref="securityRequestMapFactoryBean" />
- </beans:bean>
- <beans:bean id="antUrlPathMatcher"
- class="org.springframework.security.web.util.AntUrlPathMatcher" />
- <beans:bean id="affirmativeBasedAccessDecisionManager"
- class="org.springframework.security.access.vote.AffirmativeBased">
- <beans:property name="decisionVoters" ref="roleDecisionVoter" />
- </beans:bean>
- <beans:bean name="roleDecisionVoter"
- class="org.springframework.security.access.vote.RoleVoter" />
- <beans:bean id="loginLogAuthenticationSuccessHandler"
- class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
- <beans:property name="defaultTargetUrl" value="/page/main.jsp"></beans:property>
- </beans:bean>
- <beans:bean id="simpleUrlAuthenticationFailureHandler"
- class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
- <!--
- 可以配置相应的跳转方式。属性forwardToDestination为true采用forward false为sendRedirect
- -->
- <beans:property name="defaultFailureUrl" value="/page/login.jsp"></beans:property>
- </beans:bean>
- <!-- 未登录的切入点 -->
- <beans:bean id="authenticationProcessingFilterEntryPoint"
- class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
- <beans:property name="loginFormUrl" value="/page/login.jsp"></beans:property>
- </beans:bean>
- </beans:beans>
------------------------------------------------------ 分割线 -----------------------------------------------------------------
后记: 由于权限配置信息,是由初始化mySecurityMetadataSource时,就由mySecurityMetadataSource读取提供的权限信息,并缓存与该类的私有成员变量中,所以重新加载时就需要重新新建一个对象
- public void loadSecurityInfos(){
- this.clear();
- List<Module> modules = moduleDao.getAll(new Module());
- Collections.sort(modules);
- for (Module module : modules) {
- RequestKey requestKey = new RequestKey(module.getPageUrl());
- Collection<ConfigAttribute> configAttributes = new LinkedList<ConfigAttribute>();
- moduleDao.refresh(module);
- List<Role> roles = module.getRoles();
- if(roles != null){
- for (final Role role : roles) {
- configAttributes.add(new ConfigAttribute() {
- public String getAttribute() {
- return role.getCode();
- }
- });
- }
- }
- this.put(requestKey, configAttributes);
- log.info(module.getName()+ "模块 URL模式:" + requestKey + " 授权角色:"+ roles);
- }
- }
发表评论
-
在spring security3上实现验证码
2012-04-21 16:07 655在spring security3上实现验证码 h ... -
Spring Security3.1登陆验证 替换 usernamepasswordfilter
2012-04-15 02:01 3429一、前言 在上一篇http://blog.c ... -
Spring Security 3应用的11个步骤
2012-04-15 01:47 1194Spring Security 3应用的11个步骤 ... -
在spring security3上实现验证码
2012-03-01 08:44 635转载: 在spring securi ... -
spring security 密码编码器
2012-03-14 08:13 993spring security 密码编码器 (2 ... -
spring security 配置详解
2012-02-25 11:50 2262http://static.springsource.org/ ... -
图解Spring Security默认使用的过滤器
2012-02-24 08:13 793转载:http://www.flyysoft.com/plus ... -
Spring Security 3 与 CAS单点登录配置-Server
2012-03-15 19:56 1307转载:http://www.hxdw.com/bbs/post ... -
Topic: Spring Security 3 与 CAS单点登录配置-Client
2012-02-26 12:12 833转载: http://www.hxdw.com ... -
Spring Security 3 基于角色访问控制过程详解
2012-02-19 13:25 1421访问控制:由于我们配 ... -
修改spring security源码实现动态授权
2012-02-21 08:15 940修改spring security源码实现动态 ... -
spring security 3.0 logout filter 代码中的一个小bug
2012-03-15 19:57 1032spring security 3.0 log ... -
spring security 源码分析: 过滤器
2012-03-19 08:23 1019spring security 源码分析: 过 ... -
spring security遇到的一些问题
2012-03-19 08:24 670spring security遇到的一些问题 ... -
spring security 源码解读 1
2012-03-19 08:24 887http://feiyan35488.iteye.com/bl ...
相关推荐
本项目基于Spring,整合Spring的security模块,实现用户管理和权限控制,是一套较为通用的权限控制功能,主要内容如下: 1.登录,包括“记住我”的功能; 2.加密,存储的密码不采用明文,初始密码1234; 3.拦截器...
本压缩包文件“用springsecurity实现登录和RBAC权限管理_hy5.zip”中包含的项目名为“securitylogin-master”,显然这是一个专注于实现基于Spring Security的登录功能以及RBAC权限管理的应用程序。在这个项目中,...
基于SpringBoot+SpringSecurity+JPA的RBAC权限模型的实现,不仅能够帮助开发者快速构建安全可靠的应用程序,而且其模块化和灵活性的特点,能够适应不断变化的业务需求和安全挑战。项目开发人员需要具备扎实的Java...
本项目是一个基于Spring Security鉴权机制实现的RBAC(基于角色的访问控制)权限校验的后台管理后端系统。RBAC是一种在应用程序中实现权限管理的有效方式,它将权限与角色关联,通过角色的分配来控制用户对资源的...
本项目通过Spring Boot、Spring Security和JPA技术栈,实现了一个功能完善的基于RBAC的权限管理模型。这种模型能够满足现代企业对于复杂权限控制的需求,确保了系统的安全性和易用性,为构建安全可靠的企业级应用...
基于SpringSecurity的RBAC权限管理系统以其高度的可配置性和强大的安全性,成为了构建安全应用程序的首选方案。它为开发者提供了一套完善的安全框架,通过简单的配置和编码就能实现复杂的权限管理功能,极大地简化了...
本项目 "基于 spring-security 实现 RBAC 权限模型-hello-security.zip" 提供了一个基础示例,帮助开发者了解如何在 Spring 应用程序中实施基于角色的访问控制(Role-Based Access Control,简称 RBAC)模型。...
标题中的“管理系统系列--Pre基于Spring Boot 、Spring Security的RBAC权限管理系统, 做更简洁.zip”表明这是一个关于构建权限管理系统的教程或代码示例,它利用了Spring Boot和Spring Security这两个核心的Java技术...
基于SpringBoot和SpringSecurity的RBAC权限管理系统是一套完整的解决方案,其核心设计理念是基于角色的访问控制(Role-Based Access Control)。RBAC模型在现代的权限管理系统中应用广泛,它通过角色将权限赋予用户...
在本项目中,“基于Spring Security的RBAC权限管理系统”结合了Spring Security框架和RBAC访问控制模型,旨在构建一个灵活且功能强大的安全系统。这样的系统通常需要实现用户认证、权限授权、角色管理、资源访问控制...
Spring Security是Spring生态系统中的安全模块,用于处理身份验证和授权。在这个RBAC系统中,Spring Security负责用户的登录验证、权限控制以及访问限制等功能。通过Spring Security,我们可以轻松地实现对URL的...
理解并掌握这个项目,你需要熟悉Spring Boot的开发、Spring Cloud微服务架构、OAuth2的授权流程以及RBAC权限模型。同时,对于数据库设计和前端开发基础也有一定的要求。通过深入学习和实践这个项目,你将能够提升在...
在开发一个基于Spring Security的RBAC权限管理系统时,核心目标是构建一个安全框架,使得系统管理员能够以直观且有效的方式管理用户权限。这样的系统通常会包含用户认证、权限分配、角色管理等模块。用户认证负责...
本项目“基于SpringBoot、SpringSecurity的RBAC权限管理系统”是一个采用Java语言开发的权限管理系统,其核心功能在于通过SpringBoot框架与SpringSecurity安全框架,实现了对用户、角色、权限的动态管理,并且确保了...
在本项目"SpringBoot_SpringSecurity_JWT_RBAC"中,开发者使用了现代Web应用程序开发中的几个关键组件,包括Spring Boot、Spring Security以及JSON Web Token(JWT)和Role-Based Access Control(RBAC)来实现一个...
可能包含的内容有:SpringSecurity的架构设计、AOP(面向切面编程)在安全中的应用、基于角色的访问控制(Role-Based Access Control, RBAC)、OAuth支持、CSRF(跨站请求伪造)防护、以及如何与其他Spring模块如...
本文所提到的"【Java】springSecurity+jwt前后端分离基于RBAC权限检验_02.zip"压缩包,提供了后端系统权限管理的一个强大示例。开发人员可以从中学习如何集成Spring Security和JWT来构建一个安全、高效、易于管理的...
SpringSecurity 是一个强大的且高度可定制的身份验证和访问控制框架,用于保护基于Java的应用程序。在本示例中,我们将探讨如何使用 SpringSecurity 构建一个基本的认证和授权流程。 首先,Spring Security 的核心...
总结,这个基于SpringBoot+SpringSecurity的RBAC管理系统,旨在为开发者提供一个清晰易懂的示例,帮助他们更好地掌握权限管理的实践。通过学习这个项目,你可以了解到SpringBoot的快速开发特性,SpringSecurity的...
在IT领域,构建一个权限管理系统是企业级应用的常见需求,Spring Security、MyBatis和Spring MVC的整合正是实现这一目标的有效方式。这三个组件分别在不同的层面上为系统提供了强大的支持。 Spring Security是一款...