`
孟雪雪
  • 浏览: 53020 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

spring security 3.0 的 用户详细信息的 session 扩展 (基于rapid framework)

阅读更多
applicationContext-security.xml:



<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:s="http://www.springframework.org/schema/security"
    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-2.5.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.4.xsd"
    default-autowire="byType" default-lazy-init="true">

    <description>使用SpringSecurity的安全配置文件</description>

    <!-- http安全配置 -->
    <s:http auto-config="true" access-decision-manager-ref="accessDecisionManager">
        <s:form-login login-page="/pages/Login/login.do" />
        <s:logout logout-success-url="/" />
        <s:remember-me key="ssss" />
    </s:http>
    <!-- 自定义成功和失败处理器,AppSessionSuccessHandler中设置了session -->
    <bean id="appSessionProcessingFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationProcessingFilter">
        <s:custom-filter before="AUTHENTICATION_PROCESSING_FILTER" />
        <property name="authenticationFailureHandler">
            <bean class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
                <property name="defaultFailureUrl" value="/pages/Login/login.do?error=true"/>
            </bean>
        </property>
        <property name="authenticationSuccessHandler">
            <bean class="javacommon.base.AppSessionSuccessHandler">
                <property name="defaultTargetUrl" value="/"/>
            </bean>
        </property>
    </bean>  

    <!-- 认证配置 -->
    <s:authentication-provider user-service-ref="userDetailsService">
        <!-- 可设置hash使用sha1或md5散列密码后再存入数据库 -->
        <s:password-encoder hash="plaintext" />
    </s:authentication-provider>

    <!-- 项目实现的用户查询服务 -->
    <bean id="userDetailsService" class="com.awd.service.UserDetailServiceImpl" />

    <!-- 重新定义的FilterSecurityInterceptor,使用databaseDefinitionSource提供的url-授权关系定义 -->
    <bean id="filterSecurityInterceptor" class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
        <s:custom-filter before="FILTER_SECURITY_INTERCEPTOR" />
        <property name="accessDecisionManager" ref="accessDecisionManager" />
        <property name="objectDefinitionSource" ref="databaseDefinitionSource" />
    </bean>

    <!-- DefinitionSource工厂,使用resourceDetailService提供的URL-授权关系. -->
    <bean id="databaseDefinitionSource" class="javacommon.base.DefinitionSourceFactoryBean">
        <property name="resourceDetailService" ref="resourceDetailService" />
    </bean>
   
    <!-- 项目实现的URL-授权查询服务 -->
    <bean id="resourceDetailService" class="com.awd.service.ResourceDetailServiceImpl" />

    <!-- 授权判断配置, 将授权名称的默认前缀由ROLE_改为A_. -->
    <bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
        <property name="decisionVoters">
            <list>
                <bean class="org.springframework.security.access.vote.RoleVoter">
                    <property name="rolePrefix" value="A_" />
                </bean>
                <bean class="org.springframework.security.access.vote.AuthenticatedVoter" />
            </list>
        </property>
    </bean>
</beans>




AppSessionSuccessHandler:



package javacommon.base;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.security.web.savedrequest.SavedRequest;
import org.springframework.security.web.util.RedirectUtils;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import com.awd.dao.UsersDao;
import com.awd.model.Users;

@Transactional(readOnly = true)
public class AppSessionSuccessHandler extends
        SavedRequestAwareAuthenticationSuccessHandler {

    @Autowired
    private UsersDao usersDao;

    public void onAuthenticationSuccess(HttpServletRequest request,
            HttpServletResponse response, Authentication authentication)
            throws ServletException, IOException {

        SavedRequest savedRequest = getSavedRequest(request);

        if (savedRequest == null) {
            super.onAuthenticationSuccess(request, response, authentication);

            return;
        }

        if (isAlwaysUseDefaultTargetUrl()
                || StringUtils.hasText(request
                        .getParameter(getTargetUrlParameter()))) {
            removeSavedRequest(request);
            super.onAuthenticationSuccess(request, response, authentication);

            return;
        }

        // 参考Lingo 的Spring security 3.0文档 附录 C. Spring Security-3.0.0.M1

        HttpSession session = request.getSession();
        UserDetails userDetails = (UserDetails) authentication.getPrincipal();
        Users currentUser = usersDao.findByUnique("loginname", userDetails.getUsername().toString());
        session.setAttribute("currentUser", currentUser);

        // Use the SavedRequest URL
        String targetUrl = savedRequest.getFullRequestUrl();
        logger.debug("Redirecting to SavedRequest Url: " + targetUrl);
        RedirectUtils.sendRedirect(request, response, targetUrl,
                isUseRelativeContext());

    }

    private SavedRequest getSavedRequest(HttpServletRequest request) {
        HttpSession session = request.getSession(false);

        if (session != null) {
            return (SavedRequest) session
                    .getAttribute(SavedRequest.SPRING_SECURITY_SAVED_REQUEST_KEY);
        }

        return null;
    }

    private void removeSavedRequest(HttpServletRequest request) {
        HttpSession session = request.getSession(false);

        if (session != null) {
            logger.debug("Removing SavedRequest from session if present");
            session
                    .removeAttribute(SavedRequest.SPRING_SECURITY_SAVED_REQUEST_KEY);
        }
    }
}








UserDetailServiceImpl.java



package com.awd.service;

import java.util.HashSet;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.transaction.annotation.Transactional;

import com.awd.dao.UsersDao;
import com.awd.model.Authorities;
import com.awd.model.Roles;
import com.awd.model.Users;


/**
* 实现SpringSecurity的UserDetailsService接口,实现获取用户Detail信息的回调函�数.
*
* @author calvin  edit by meetrice
*/
@Transactional(readOnly = true)
public class UserDetailServiceImpl implements UserDetailsService {
   
   
    @Autowired
    private UsersDao usersDao;

    /**
     * 获取用户Detail信息的回调函�数.
     */
    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException, DataAccessException {

        Users users = usersDao.findByUnique("loginname", userName);
        if (users == null)
            throw new UsernameNotFoundException("用户" + userName + " 不存在");

        GrantedAuthority[] grantedAuths = obtainGrantedAuthorities(users);
        // 无以下属性,暂时全部设为true.
        boolean enabled = true;
        boolean accountNonExpired = true;
        boolean credentialsNonExpired = true;
        boolean accountNonLocked = true;

        org.springframework.security.core.userdetails.User userdetail = new org.springframework.security.core.userdetails.User(
                users.getLoginname(), users.getPassword(), enabled, accountNonExpired, credentialsNonExpired,
                accountNonLocked, grantedAuths);

        return userdetail;
    }

    /**
     * 获得用户所有角色的权限.
     */
    private GrantedAuthority[] obtainGrantedAuthorities(Users user) {
        Set<GrantedAuthority> authSet = new HashSet<GrantedAuthority>();
        for (Roles role : user.getRoles()) {
            for (Authorities authority : role.getAuthorities()) {
                authSet.add(new GrantedAuthorityImpl(authority.getName()));
            }
        }
        return authSet.toArray(new GrantedAuthority[authSet.size()]);
    }
}

转载自 http://www.cnblogs.com/meetrice/archive/2009/08/04/1538441.html
分享到:
评论

相关推荐

    spring security3.0所需要的最精简的jar包

    在3.0版本中,Spring Security 已经相当成熟,提供了丰富的特性来保障应用的安全性。 在开始使用Spring Security时,了解并正确引入必要的jar包是至关重要的。以下是你提供的压缩包文件中的关键组件: 1. **spring...

    spring security3.0帮助文档

    ### Spring Security 3.0权限控制详解 Spring Security是Spring框架的一个强大且高度可定制的安全模块,用于保护基于Web和非Web的应用程序。版本3.0的发布带来了许多改进和新特性,使其成为处理安全需求的首选解决...

    SpringSecurity3.0 教程

    SpringSecurity3.0是Spring框架的一个重要扩展,主要用于企业级应用的安全管理,提供了一套全面的访问控制和安全解决方案。本教程将深入探讨SpringSecurity3.0的核心概念、配置及其实现方式,帮助开发者理解并掌握...

    SpringSecurity3.0.x官方参考文档(英文+中文双解版)

    - **UserDetailsService**:用户详细信息服务,用于从数据源获取用户信息。 - **Role Hierarchy**:角色层次,允许定义角色之间的继承关系。 ### 2. 配置方式 Spring Security 3.0.x 提供了基于XML和基于Java的...

    spring security3.0 demo

    Spring Security 是一个强大的且高度可定制的身份验证和访问控制框架,用于保护基于 Java 的应用程序。在3.0版本中,它提供了许多关键功能,旨在确保应用程序的安全性,防止未经授权的访问,并实现用户身份验证和...

    SpringSecurity3.0 Demo

    在实际应用中,我们通常需要配置`web.xml`以集成SpringSecurity的过滤器链,并创建自定义的`UserDetailsService`来处理用户账户信息。接着,通过XML或Java配置定义安全规则,例如设置访问URL的权限,定义匿名访问的...

    springMVC+springSecurity3.0+maven

    标题 "springMVC+springSecurity3.0+maven" 指的是一个集成项目,它结合了Spring MVC、Spring Security 3.0和Maven这三个关键的Java开发工具和技术。让我们逐一深入理解这些技术及其相互之间的关系。 首先,Spring ...

    Spring Security 3.0 权限管理

    Spring Security 3.0 是一个强大的安全框架,用于在Java应用程序中实现全面的安全管理解决方案。它专注于提供身份验证、授权和访问控制功能,确保只有经过验证的用户才能访问受保护的资源。本教程将深入探讨Spring ...

    SpringSecurity 3.0基础配置实例+Mysql数据库文件+Jar包

    SpringSecurity3.0相对比较稳定。本实例包含SpringSecurity3.0的基本配置,包含所需的Jar包和mysql数据库文件,直接导入myeclipes中并导入数据库即可运行,配置文件简单易懂,适合SpringSecurity初学者配置入门。...

    spring security3.0所有最新开发包及源码及文档

    3. **文档**:可能包括用户指南、API参考文档、开发者文档等,帮助开发者了解如何使用和配置Spring Security 3.0。 4. **示例代码**:演示了如何在实际应用中集成和使用Spring Security,有助于快速上手。 5. **...

    教你使用 SpringSecurity 3.0

    教你使用 SpringSecurity 3.0 一步一步教你使用SpringSecurity,从保护web应用到保护业务方法调用

    Spring Security 3.0 安全权限管理手册

    ### Spring Security 3.0 安全权限管理手册 #### 一、引言 随着互联网技术的迅猛发展,系统的安全性成为越来越受关注的话题。在众多安全框架中,Spring Security 因其灵活性、可扩展性以及丰富的特性而备受青睐。本...

    spring security3.0 源码

    spring-security-web-3.0 spring-security-taglibs-3.0 spring-security-openid-3.0 spring-security-core-3.0 spring-security-config-3.0 spring-security-aspects-3.0 spring-security-acl-3.0

    spring security 3.0入门教程PDF

    通过以上的知识点,用户能够对Spring Security 3.0有一个全面的了解,并且能够根据这些知识开始配置和使用Spring Security,来为自己的Web应用程序提供安全性保护。随着学习的深入,用户可以对框架进行更高级的定制...

    Spring-Security3.0自定义表结构

    ### Spring Security 3.0 自定义表结构详解 在企业级应用开发中,Spring Security作为Spring框架的一个子项目,提供了一套完整的权限管理和安全性解决方案。它不仅能够处理身份验证(authentication)和授权...

    基于Spring Boot 3.0、 Spring Cloud 2022 & Alibaba 的微服务RBAC 权限管理系统

    介绍一个基于Spring Boot 3.0、Spring Cloud 2022 & Alibaba的微服务RBAC权限管理系统。该系统可以实现微服务RBAC权限管理,通过RBAC权限管理机制对用户访问系统的权限进行限制,从而提高系统的安全性和可用性。同时...

    spring3.0+spring security3.1.4 api chm 中文版

    《Spring 3.0 + Spring Security 3.1.4 API 中文版》是一份集成了Spring框架3.0和Spring Security 3.1.4的中文帮助文档,旨在为开发者提供详尽的API参考和指导。这两个核心组件在企业级Java应用开发中扮演着至关重要...

    spring security 3.0x remember-me 免登陆

    其中,"key"是安全密钥,用于防止中间人攻击,userDetailsService是Spring Security的UserDetailsService接口的实现,用于查找用户信息。 3. **配置RememberMeAuthenticationProvider**:在Spring Security的配置...

    LEARNING SPRING BOOT 3.0 - THIRD EDITION

    《Learning Spring Boot 3.0 - 第三版》是一本专为Java和Spring开发者准备的指南,由Greg L. Turnquist撰写。这本书旨在简化生产级应用程序的开发过程,特别是利用Spring Boot 3.0框架。Spring Boot是Spring生态系统...

Global site tag (gtag.js) - Google Analytics