`

spring security 成功案例

 
阅读更多
    说到权限系统,几乎每个系统都要用到,只要涉及到人操作和管理的的系统。而权限系统的核心那就是:授权和认证。
大道至简,根据这个核心所有的第三方还是适合自己的权限系统都围绕此进行。
    Spring Security 也是如此,在系统中怎样接入Spring Security呢?主要有以下几步:

1、配置文件

<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.spr ingframework.org/schema/security
           http://www.springframework.org/schema/security/spring-security-3.1.xsd">
          
    <http>  
        <intercept-url pattern="/login.htm"   access="IS_AUTHENTICATED_ANONYMOUSLY" />  
        
        <form-login login-page="/login.htm" login-processing-url="/login_process.htm" 
        	authentication-failure-url="/login.htm?error=true" default-target-url="/index.htm"
        	password-parameter="password" username-parameter="username" />  
        <http-basic />  
        <logout logout-success-url="/login.htm" logout-url="/logout.htm"/>  
         <remember-me  token-validity-seconds="604800"  />  <!-- 1 week -->
        <custom-filter ref="resourceSecurityInterceptor" before="FILTER_SECURITY_INTERCEPTOR"/>
    </http>  
  
    <authentication-manager alias="authenticationManager">
         <authentication-provider user-service-ref="securityManager">  
	        <password-encoder hash="md5"/>  
	    </authentication-provider>  
    </authentication-manager>  
      
    <beans:bean id="securityManager" class="com.apache.platform.service.authorization.SecurityManagerSupport"></beans:bean>
      
    <beans:bean id="resourceSecurityInterceptor" class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor"> 
      	<!-- 认证管理 --> 
        <beans:property name="authenticationManager" ref="authenticationManager"/>  
        <!-- 访问决策 -->
        <beans:property name="accessDecisionManager" ref="accessDecisionManager"/> 
        <!-- 资源定义 --> 
        <beans:property name="securityMetadataSource" ref="secureResourceFilterInvocationDefinitionSource" />  
    </beans:bean>  
    
   <!-- 访问决策器 -->
	<beans:bean id="accessDecisionManager"
		class="com.apache.platform.service.authorization.AccessDecisionManager">
	</beans:bean>
    
    <beans:bean id="secureResourceFilterInvocationDefinitionSource" class="com.apache.platform.service.authorization.SecureResourceFilterInvocationDefinitionSource" />  
</beans:beans>


 整个权限系统的接入围绕这个配置文件展开。
1》 认证管理
主要提供用户登录访问认证操作
2》 访问决策
对资源访问定义规则和策略
3》 资源定义
根据认证用户加载访问资源

SecurityManagerSupport.java

/**
 * 
 */
package com.apache.platform.service.authorization;

import java.util.ArrayList;
import java.util.Collection;

import javax.servlet.ServletContext;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.web.context.ServletContextAware;

import com.apache.platform.common.CommConstant;
import com.apache.platform.service.IUserManager;

/**
 * @author tangss
 * @2013年9月28日 @上午9:19:25
 */
public class SecurityManagerSupport implements UserDetailsService, ServletContextAware {

    @Autowired
    private IUserManager userManager;

    ServletContext       servletContext;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        UserDetails user = null;
        if (StringUtils.isNotEmpty(username) && username.equals("test")) {
            Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
            authorities.add(new SimpleGrantedAuthority("admin_role"));
            user = new UserInfo(username, "e10adc3949ba59abbe56e057f20f883e", true, true, true, true, authorities);
        } else {
            user = userManager.getUserByUserName(username);
        }
        this.servletContext.setAttribute(CommConstant.USER_INFO, user);
        return user;
    }

    /*
     * (non-Javadoc)
     * @see org.springframework.web.context.ServletContextAware#setServletContext(javax.servlet.ServletContext)
     */
    @Override
    public void setServletContext(ServletContext servletContext) {
        this.servletContext = servletContext;
    }

}


AccessDecisionManager.java

package com.apache.platform.service.authorization;

import java.util.Collection;

import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.access.SecurityConfig;
import org.springframework.security.authentication.InsufficientAuthenticationException;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;

/**
 * 
 * 
 */
public class AccessDecisionManager implements org.springframework.security.access.AccessDecisionManager {

    @Override
    public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes)
                                                                                                                  throws AccessDeniedException,
                                                                                                                  InsufficientAuthenticationException {
        if (configAttributes == null) {
            return;
        }
        for (ConfigAttribute ca : configAttributes) {
            String needRole = ((SecurityConfig) ca).getAttribute();
            for (GrantedAuthority ga : authentication.getAuthorities()) {
                if (needRole.equals(ga.getAuthority())) {
                    return;
                }
            }
        }
        throw new AccessDeniedException("没有权限");
    }

    @Override
    public boolean supports(ConfigAttribute attribute) {
        return true;
    }

    @Override
    public boolean supports(Class<?> clazz) {
        return true;
    }

}


SecureResourceFilterInvocationDefinitionSource.java

/**
 * 
 */
package com.apache.platform.service.authorization;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.servlet.ServletContext;

import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.access.SecurityConfig;
import org.springframework.security.web.FilterInvocation;
import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
import org.springframework.security.web.util.AntPathRequestMatcher;
import org.springframework.security.web.util.RequestMatcher;
import org.springframework.web.context.ServletContextAware;

import com.apache.platform.common.CommConstant;

/**
 * @author tangss
 * @2013年9月28日 @上午9:44:38
 */
public class SecureResourceFilterInvocationDefinitionSource implements FilterInvocationSecurityMetadataSource, ServletContextAware {

    private Map<String, String>                      linkMap;
    private Map<String, Collection<ConfigAttribute>> resourceMap = new HashMap<String, Collection<ConfigAttribute>>();

    // 获得请求资源所需的权限
    @Override
    public Collection<ConfigAttribute> getAttributes(Object filter) throws IllegalArgumentException {
        if (linkMap == null || linkMap.isEmpty()) {
            return null;
        }
        RequestMatcher matcher = null;
        Set<Entry<String, String>> linkSet = linkMap.entrySet();
        for (Entry<String, String> entry : linkSet) {
            String url = entry.getKey();
            matcher = new AntPathRequestMatcher(url);
            if (matcher.matches(((FilterInvocation) filter).getRequest())) {
                Collection<ConfigAttribute> configAttributes = resourceMap.get(url);
                if (configAttributes != null) {
                    return configAttributes;
                }
                // 解析 role
                String value = entry.getValue(); // split by comma
                String values[] = value.split(",");
                configAttributes = new ArrayList<ConfigAttribute>();
                for (String attribute : values) {
                    ConfigAttribute configAttribute = new SecurityConfig(attribute);
                    configAttributes.add(configAttribute);
                }
                resourceMap.put(url, configAttributes);
                return configAttributes;
            }
        }
        return null;
    }

    @Override
    public Collection<ConfigAttribute> getAllConfigAttributes() {
        return null;
    }

    @Override
    public boolean supports(Class<?> clazz) {
        return true;
    }

    @SuppressWarnings("unchecked")
    @Override
    public void setServletContext(ServletContext servletContext) {
        linkMap = (Map<String, String>) servletContext.getAttribute(CommConstant.LINK_MAP);
    }

}

2、登录页面

#set($layout = "/layout/blankLayout.vm")
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>登录</title>
<script type="text/javascript" src="$!{scriptsPath}scripts/common/jquery-1.10.2.js"></script>
<link rel="stylesheet" type="text/css" href="$!{stylesPath}styles/login.css" />
</head>
<body>
<form method="post" action="login_process.htm">
	<div class="login">
	<p>
    	用户名:<input type="text" name="username" />
	<p>
    	密&nbsp;&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"  /> 
	</p> 
	</p> 
	<p>
		<input type="checkbox" name="_spring_security_remember_me" /> 记住我 
	</p> 
	<p> 
		<input type="submit" value="登	录" class="btn" />
	</p> 
	</div>
</form>
</body>
</html>	


3 、web.mxl 配置

	<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>*.htm</url-pattern>
	</filter-mapping>
  
4、maven pom.xml

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>3.1.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>3.1.4.RELEASE</version>
    </dependency>

 

分享到:
评论

相关推荐

    spring security 完整项目实例

    Spring Security 是一个强大的安全框架,用于为Java应用提供身份验证和授权服务。在这个完整的项目实例中,我们将深入探讨Spring Security的核心概念以及如何将其应用于实际的Web应用程序开发。 首先,我们从用户、...

    spring-security 案例

    在这个“spring-security”案例中,我们将深入探讨Spring Security如何实现权限管理和登录权限。 1. **Spring Security基本概念** - **身份验证(Authentication)**:确认用户身份的过程,通常涉及用户名和密码。...

    springSecurity 案例

    这个"SpringSecurity案例"包含了学习和分析SpringSecurity所需的资源,解压缩后的文件可以直接在Eclipse环境中运行,这为开发者提供了一个便捷的学习平台。 首先,SpringSecurity的核心功能包括用户认证和权限授权...

    SpringSecurity.pdf

    此外,Spring Security还提供了一个快速入门案例,帮助初学者理解如何通过配置来保护应用程序的资源。 Spring Security之所以在Java社区中广泛流行,是因为它不仅提供了强大的安全特性,还具有高可定制性、良好的...

    一个比较好的spring security实例

    Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理。它提供了认证、授权和访问控制等功能,使得开发者可以轻松地在应用程序中实现复杂的安全需求。在这个名为 "mysecurity" 的压缩包中,很可能是...

    springsecurity3.1.3 案例

    在这个"Spring Security 3.1.3案例"中,我们将探讨这个版本的一些核心概念和特性,以及如何利用它们来保护你的应用程序。 首先,让我们了解Spring Security的基本架构。它主要由四个主要组件组成:认证、授权、访问...

    spring-security-sample案例代码

    这个"spring-security-sample"案例代码提供了一个实战教程,帮助开发者理解和应用Spring Security的核心概念。在这个项目中,我们将深入探讨Spring Security的基本配置、认证流程以及授权机制。 首先,Spring ...

    SpringMVC集成SpringSecurity

    SpringMVC 和 SpringSecurity 是两个在Java Web开发中极为重要的框架。SpringMVC 主要负责处理Web应用的请求-响应模型,提供了一种强大的、可扩展的架构来构建现代的、基于HTTP的服务。而SpringSecurity,则是用于...

    SpringSecurity入门Demo实例

    Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于Java应用程序。在这个入门Demo实例中,我们将探讨如何配置和使用Spring Security来保护我们的Java应用。教程链接提及的CSDN博客文章提供了...

    Spring Security 完整实例

    **Spring Security 概述** Spring Security 是一个强大的且高度可定制的身份验证和授权框架,用于保护基于Java的应用程序。它提供了全面的安全解决方案,包括身份验证、授权、会话管理以及跨站请求伪造(CSRF)防护...

    spring security 源码案例

    在这个源码案例中,你将有机会深入理解Spring Security的工作原理,并学习如何配置和使用它。 首先,Spring Security的核心组件包括Authentication(认证)和Authorization(授权)。认证是验证用户身份的过程,而...

    精彩:Spring Security 演讲PPT

    ### Spring Security 概述与应用实践 #### 一、引言 在当今互联网时代,网络安全问题日益凸显,尤其是Web应用程序的...同时,结合实际案例的学习,能够帮助我们更好地理解和掌握Spring Security的核心概念与使用技巧。

    spring security3.0.3案例

    在这个"Spring Security 3.0.3案例"中,我们将深入探讨如何利用这个版本的框架来实现一个简洁且高效的权限管理系统,无需依赖复杂的配置文件。该案例特别强调了通过最小化的配置来管理用户角色和访问资源。 首先,...

    SpringSecurity 基础案例

    在这个基础案例中,我们将探讨如何利用SpringSecurity对接数据库来实现用户的登录功能。 首先,我们需要在SpringBoot项目中引入SpringSecurity的依赖。在pom.xml或build.gradle文件中添加对应的依赖项,确保Spring...

    spring security4登陆例子

    ### Spring Security 4 登录示例详解 #### 一、概览 在现代Web应用开发中,安全性至关重要。Spring Security 是一款广泛使用的安全框架,它为基于Spring的应用提供了全面的安全解决方案,包括认证、授权等核心功能...

    SpringBoot+SpringSecurity整合(实现了登录认证和权限验证)完整案例,基于IDEA项目

    SpringBoot+SpringSecurity整合示例代码,实现了从数据库中获取信息进行登录认证和权限认证。 本项目为idea工程,请用idea2019导入(老版应该也可以)。 本项目用户信息所需sql文件,在工程的resources文件夹下,...

    基于Groovy的Spring Security学习案例源码

    该项目是基于Groovy语言的Spring Security学习案例源码,包含20个文件,其中包括6个Groovy文件、3个Markdown文件、3个XML文件、3个HTML文件等。这些文件可用于学习和实践Spring Security的安全特性,适用于希望深入...

    SPRINGSECURITY应用案例

    这个案例主要探讨了在Spring Security 3.2版本中如何在Web应用程序中实施安全控制。我们将详细解析三个关键知识点:登录验证的改造、基于数据库的资源权限控制以及对Spring Bean中类方法的控制。 首先,我们来探讨...

    spring security 3.1学习资料 及 附件下载

    阅读这份文档,可以了解到Spring Security的架构设计、配置方法以及实战案例。而"Spring Security 3.1.zip"文件可能包含了示例代码或额外的教程资源,用于辅助学习和实践。 总结,Spring Security 3.1作为一款强大...

    SpringBoot+SpringSecurity案例Demo

    在这个"SpringBoot+SpringSecurity案例Demo"中,我们将了解以下核心知识点: 1. **SpringBoot配置**: - 创建SpringBoot项目,添加SpringSecurity起步依赖。 - 配置主应用类,启用SpringSecurity。 - 使用YAML或...

Global site tag (gtag.js) - Google Analytics