`
houjiang2100
  • 浏览: 22830 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

学习spring-security的相关

阅读更多
	<beans:bean id="loggerListener"
		class="org.springframework.security.authentication.event.LoggerListener" />
	<http access-denied-page="/home.html"  auto-config="true">
		<intercept-url pattern="/style/**" filters="none" />
		<form-login login-page="/index.jsp"
			authentication-failure-url="/index.jsp?error=true"
			default-target-url="/login.action" />
		<logout logout-success-url="/quit.action" invalidate-session="true"/>
		
		<!-- 防止同一用户多次登录,使第二次登录失败  -->
		<session-management invalid-session-url="/index.jsp">
			<concurrency-control expired-url="/index.jsp" max-sessions="1" />
		</session-management>
		<!--filter-security-interceptor
			增加一个filter,这点与Acegi是不一样的,不能修改默认的filter了,这个filter位于FILTER_SECURITY_INTERCEPTOR之前
		 <custom-filter ref="loginFilter" before="FORM_LOGIN_FILTER"  />  
		-->
		
		<custom-filter before="FILTER_SECURITY_INTERCEPTOR" ref="urlSecurityFilter" />
	</http>

	<!--
		一个自定义的filter,必须包含authenticationManager,accessDecisionManager,securityMetadataSource三个属性,
		我们的所有控制将在这三个类中实现,解释详见具体配置
	-->
	<beans:bean id="urlSecurityFilter" class="com.winsen.auth.UrlSecurityInterceptorFilter">
		<!-- 用户拥有的权限 -->
		<beans:property name="authenticationManager" ref="myAuthenticationManager" />
		<!-- 用户是否拥有所请求资源的权限 -->
		<beans:property name="accessDecisionManager" ref="myAccessDecisionManager" />
		<!-- 资源与权限对应关系 -->
		<beans:property name="securityMetadataSource" ref="mySecurityMetadataSource" />
	</beans:bean>

	<!-- 认证管理器,实现用户认证的入口,主要实现UserDetailsService接口即可 -->
	<authentication-manager alias="myAuthenticationManager">
		<authentication-provider user-service-ref="myUserDetailServiceImpl" >
		   <!--
				如果用户的密码采用加密的话,可以加点“盐” <password-encoder hash="md5" />
			-->
			<password-encoder hash="plaintext" />
		</authentication-provider>
	</authentication-manager>
	
	<beans:bean id="myAccessDecisionManager" class="com.winsen.auth.AccessDecisionManagerImpl"></beans:bean>	
	<beans:bean id="mySecurityMetadataSource" class="com.winsen.auth.SecurityMetadataSourceImpl">
	</beans:bean>
	<beans:bean id="myUserDetailServiceImpl" class="com.winsen.manage.service.admin.UserDetailsServiceImpl">	
	</beans:bean>	

---------------------------------------------------------------------------------
spring security 的配置主要包括 http ,urlSecurityFilter bean, authentication-manager,myAccessDecisionManager,
myUserDetailServiceImpl,mySecurityMetadataSource几部分,其中http  定义过滤规则和提供的默认过滤的一些基础配置,包括登陆,登出,session管理等,和加载自定义的过滤器,或者替换提供的默认的过滤器。urlSecurityFilter bean是自定义的过滤器主要包括3个变量
。其中authenticationManager 主要用于加载登陆用户的相关信息。mySecurityMetadataSource主要用于查询系统的权限与角色的关系,,和和根据key 查询需要的权限集合。myAccessDecisionManager主要用于 验证用户是否具有相应权限,及其验证策略

---------------------------------------------------------------------------------
spring security 中文学习文档 ,讲的比较详细http://www.fengfly.com/document/springsecurity3/appendix-namespace.html#nsa-session-mgmt
---------------------------------------------------------------------------------
主要类的主要代码
public class SecurityMetadataSourceImpl  implements FilterInvocationSecurityMetadataSource{
    @Transactional(readOnly = true)
    public  void loadResourceDefine() {  
        if(resourceMap == null) {  
            resourceMap = new HashMap<String, Collection<ConfigAttribute>>();  
            List<Resource> resources = this.resourcesDao.findAll();  
            for (Resource resource : resources) {  
                Collection<ConfigAttribute> configAttributes = new ArrayList<ConfigAttribute>();  
                  //以权限名封装为Spring的security Object  
                ConfigAttribute configAttribute = new SecurityConfig(resource.getName());  
                configAttributes.add(configAttribute); 
                resourceMap.put(resource.getName(), configAttributes);  
            }  
        }            
    } 
  public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {  
    	 Collection<ConfigAttribute> resultRoleList=null;
        String requestUrl = ((FilterInvocation) object).getRequestUrl();  
        if(resourceMap == null) {  
            loadResourceDefine();  
        }  
        resultRoleList=resourceMap.get(requestUrl);
        if(resultRoleList==null){
           System.out.println(requestUrl+"---不需要验证");
        }else{
            System.out.println(requestUrl+"---需要验证");
        }
        return resultRoleList ;  
    } 
}

public class UrlSecurityInterceptorFilter extends AbstractSecurityInterceptor implements Filter{
 public void doFilter(ServletRequest request, ServletResponse response,  
            FilterChain chain) throws IOException, ServletException {  
        FilterInvocation fi = new FilterInvocation(request, response, chain);  
        invoke(fi);  
    }  
      
    private void invoke(FilterInvocation object) throws IOException, ServletException {  
        // object为FilterInvocation对象  org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl
    	Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 	
        //1.获取请求资源的权限  
        //执行
    	Collection<ConfigAttribute> attributes = securityMetadataSource.getAttributes(object); 
    	this.getAccessDecisionManager().decide(authentication, object, attributes); 
        InterceptorStatusToken token = super.beforeInvocation(object);     
        //2.是否拥有权限  
        try {  
        	object.getChain().doFilter(object.getRequest(), object.getResponse());  
        }catch (Exception e) {
		   	e.printStackTrace();
		} finally {  
            super.afterInvocation(token, null);  
        }  
    }  
}

public class AccessDecisionManagerImpl implements AccessDecisionManager {
    public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenticationException {  
        if(configAttributes == null) {    	
            return;  
        } 
       boolean result= decide(authentication, configAttributes);
       if(!result){
    	 //没有权限  
           throw new AccessDeniedException(" 没有权限访问! ");  
       }    
    }
       public boolean decide(Authentication authentication,  Collection<ConfigAttribute> configAttributes) throws InsufficientAuthenticationException {
        //所请求的资源拥有的权限(一个资源对多个权限)  
        Iterator<ConfigAttribute> iterator = configAttributes.iterator(); 
        while(iterator.hasNext()) {  
            ConfigAttribute configAttribute = iterator.next();  
            //访问所请求资源所需要的权限  
            String needPermission = configAttribute.getAttribute();  
            //用户所拥有的权限authentication  
            for(GrantedAuthority ga : authentication.getAuthorities()) {  
            	/*** 验证方式*/
                if(needPermission.equals(ga.getAuthority())) {        
                    return true;  
                }  
            }  
        }
        return false;
    }
}
@Transactional(readOnly = true)
public class UserDetailsServiceImpl implements UserDetailsService {
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {       
       // Manager users = this.usersDao.findByName(username);  
		Manager user=findUserByName(username);
        if(user == null) {  
            throw new UsernameNotFoundException(username);  
        }  
        Set<GrantedAuthority> grantedAuths = obtionGrantedAuthorities(user); 
        Set<GrantedAuthority> grantedAuthsChannel= obtionGrantedAuthoritiesChannels(user);
        grantedAuths.addAll(grantedAuthsChannel);
        //设置用户状态
        boolean enables = true;  
        boolean accountNonExpired = true;  
        boolean credentialsNonExpired = true;  
        boolean accountNonLocked = true;        
        User userdetail = new User(user.getUsername(), user.getPassword(), enables, accountNonExpired, credentialsNonExpired, accountNonLocked, grantedAuths);  
        return userdetail;  
    }  
	
	public Manager findUserByName(String username){
		Manager user =usersDao.findByName(username); 
		return user;
	}
	
    //取得用户的权限  
    private Set<GrantedAuthority> obtionGrantedAuthorities(Manager user) {  
        Set<GrantedAuthority> authSet = new HashSet<GrantedAuthority>();  
        List<Resource> resources = new ArrayList<Resource>();  
        Set<Role> roles = user.getRoles();     
        for(Role role : roles) {  
            Set<Resource> tempRes = role.getResources();  
            for(Resource res : tempRes) {  
                resources.add(res);  
            }  
        }  
        for(Resource res : resources) {  
            authSet.add(new GrantedAuthorityImpl(res.getName()));  
        }  
        return authSet;  
    } 

}
分享到:
评论

相关推荐

    spring-boot spring-security-oauth2 完整demo

    总的来说,这个“spring-boot spring-security-oauth2 完整demo”为学习和实践Spring Boot、Spring Security与OAuth2的结合提供了宝贵的参考。通过深入理解和实践这个示例,开发者不仅可以掌握这三大框架的基本用法...

    spring-security-oauth2-2.0.3.jar(包括jar包,源码,doc)

    Spring Security OAuth2是一个广泛使用的Java库,用于在Spring应用程序中实现OAuth2协议,提供安全授权服务。OAuth2是一种授权框架,允许第三方应用在用户许可的情况下访问其私有资源,如在社交媒体上的数据。2.0.3....

    spring-security源代码

    这个压缩包文件"spring-security-parent-2.0.4"是Spring Security的2.0.4版本,是一个Eclipse项目,适合开发者直接导入到Eclipse工作空间进行学习和分析。 1. **Spring Security架构**: Spring Security的架构...

    spring security 4.0.0所需jar包

    - `spring-security-core-4.0.0.CI-SNAPSHOT-sources.jar`:提供源代码,便于深入学习和调试。 - `spring-security-core-4.0.0.CI-SNAPSHOT.jar`:核心模块的主要库,包括安全性元数据、认证、授权和访问决策管理...

    spring-security-material-master.zip

    Spring Security 是一个强大的安全框架,主要用于Java web应用的安全管理。...通过学习,开发者将能够掌握如何在Spring Boot应用中有效地使用Spring Security来保护应用程序,确保数据和资源的安全。

    spring-security-oauth2与spring-security-web 3.1.2 源码

    Spring Security是Java领域中广泛应用的...总的来说,`spring-security-web 3.1.2`和`spring-security-oauth2`的源码分析将是一次深入学习Web安全和OAuth2授权的好机会,有助于提升对现代Web安全架构的理解和实践能力。

    spring-security-3.1.4

    这个zip包包含了Spring Security的核心库、文档、示例代码和其他必要的资源,便于开发者下载和学习。 Spring Security的主要功能包括: 1. **身份验证**:它提供了多种认证机制,如基于密码的认证、Remember Me...

    spring-security4.1.3

    Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于保护...通过学习和理解这个示例,你可以掌握Spring Security的基本用法,并将其应用到自己的项目中,保护你的应用程序免受未授权访问的威胁。

    spring-security-core-2.0.5.RELEASE.src

    《Spring Security核心模块详解》 在Java开发领域,Spring Security是一个强大的、高度可配置的...尽管2.0.5.RELEASE版本相对较旧,但它仍能体现Spring Security的基本架构和设计思想,为后续版本的学习提供了基础。

    spring-security-3.0.5.RELEASE

    Spring Security 是一个强大的且高度可...同时,结合官方文档或相关教程,可以更深入地学习如何在实际项目中配置和使用Spring Security 3.0.5。对于新项目,可能需要考虑升级到更高版本以获取最新的安全特性和支持。

    spring-security-4.2.4(全)资源包

    在使用这个资源包时,你需要仔细阅读相关文档,了解如何配置Spring Security以适应你的项目需求。通常,这涉及到创建安全配置类、定义访问规则、实现认证和授权逻辑等步骤。同时,由于这是一个压缩包,你还需要将其...

    spring-security-2.0.6. API和 jar包

    通过学习这个版本,我们可以了解Spring Security的基本架构和工作原理,为理解和使用更高级的版本奠定基础。同时,这个版本的API文档和JAR包对于修复旧系统中的安全问题或研究历史实现也具有参考价值。

    spring-security-reference.pdf

    对于亚马逊云服务(AWS)的学习者来说,上述文档可能并不直接相关,但了解Spring Security对于保护云服务中的应用程序同样重要。在AWS云平台中,了解如何应用和配置Spring Security可以使得开发者能够构建出更加安全的...

    spring-security-3.0.3 jar包( 含源码)

    Spring Security 是一个强大的和高度可定制的身份...在解压的`spring-security-3.0.3.RELEASE`目录中,你可以找到包括源码、文档、测试用例等相关文件,这将帮助你全面了解和掌握Spring Security 3.0.3的每一个细节。

    spring-security-3.1.3.RELEASE.jar

    《深入解析Spring Security 3.1.3.RELEASE》 Spring Security是Java领域中一个强大的安全框架,它为Web应用程序提供了全面的安全性解决方案。本文将深入探讨Spring Security 3.1.3.RELEASE版本的核心特性、工作原理...

    spring-security文档和jar包

    学习Spring Security时,需要理解其核心组件如AuthenticationManager、UserDetailsService、AccessDecisionManager等,并熟悉XML或Java配置方式来定制安全行为。同时,实践编写安全拦截器、自定义过滤器以及处理异常...

    spring-security-helloworld

    【标题】"spring-security-helloworld" 是一个基于Spring Security框架的简单示例项目,它用于初学者理解并实践Spring Security的基础用法。Spring Security是一个强大的安全框架,为Java应用程序提供了全面的安全...

    spring-security-2.0.5.jar2

    《Spring Security 2.0.5.jar:深度解析与实战指南》 在Java Web开发领域,Spring Security是一款不可或缺的安全框架,它为应用提供了强大的身份验证和授权功能。本篇文章将聚焦于Spring Security 2.0.5版本,通过...

    Spring-security学习ppt

    Spring-security配置文档教程,能够满足日常的开发配置。个人总结。

    spring-security-3.1.0.RELEASE.zip

    Spring Security 3.1.0.RELEASE是该框架的一个版本,发布于2011年,尽管现在已经有了更新的版本,但理解其核心概念对于学习Spring Security仍然是有益的。 1. **核心组件** - **Filter Chain**: Spring Security的...

Global site tag (gtag.js) - Google Analytics