`

Spring Security3简单使用

 
阅读更多

【JAVA培训】Spring Security3简单使用(权限配置在数据库中)

1、权限配置在数据库中,典型的五张表。

    1)t_user  用户表

    2)t_role  角色表

    3)t_user_role  用户-角色关联表 

    4)t_resource  资源表

    5)t_role_resource  角色-资源关联表

  2、建表语句


DROP TABLE IF EXISTS `t_resource`;
CREATE TABLE `t_resource` (
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`name`  varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`url`  varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)

DROP TABLE IF EXISTS `t_role`;
CREATE TABLE `t_role` (
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`name`  varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)

DROP TABLE IF EXISTS `t_role_resource`;
CREATE TABLE `t_role_resource` (
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`role_id`  int(11) NULL DEFAULT NULL ,
`resource_id`  int(11) NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)

CREATE TABLE `t_user` (
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`account`  varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`password`  varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)

DROP TABLE IF EXISTS `t_user_role`;
CREATE TABLE `t_user_role` (
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`user_id`  int(11) NULL DEFAULT NULL ,
`role_id`  int(11) NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)

  3、对应的领域实体

    1)用户

 

package cn.luxh.app.domain;
/**
 * 用户
 * @author Luxh
 */
public class User {
   
    private Integer id;
    /**帐号*/
    private String account;
    /**密**/
    private String password;
   
   
    @Override
    public int hashCode() {
        return account.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        User user = (User) obj;
        return this.account.equals(user.getAccount());
    }
   
    //getter setter
    //... }


    2)角色

 

package cn.luxh.app.domain;

/**
 * 角色
 * @author Luxh
 */
public class Role {
   
    private Integer id;
    /**角色名称*/
    private String name;
   
    //getter setter
    //...
}


    3)用户-角色

 

package cn.luxh.app.domain;
/**
 * 用户角色
 * @author Luxh
 */
public class UserRole {
    private Integer id;
    /**用户id*/
    private Integer userId;
    /**角色id*/
    private Integer roleId;
   
    //getter setter
    //...
}


    4)资源


package cn.luxh.app.domain;

/**
 * 资源
 * @author Luxh
 */
public class Resource {
   
    private Integer id;
    /**资源名称*/
    private String name;
    /**访问地址*/
    private String url;
   
    //getter setter
}

    5)角色-资源


package cn.luxh.app.domain;
/**
 * 角色资源
 * @author Luxh
 */
public class RoleResource {
    private Integer id;
    /**角色id*/
    private Integer roleId;
    /**资源id*/
    private Integer resourceId;
   
    //getter setter
}

  4、配置文件

    在web.xml文件中加上如下内容:

 

<!-- SpringSecurity权限框架 --> 
  <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 Security session的生命周期--> 
    <listener> 
        <listener-class> 
         org.springframework.security.web.session.HttpSessionEventPublisher  
        </listener-class> 
    </listener> 


    当然配置spring监*器的时候得把springsecurity的权限配置文件给加载进去:

 

<!-- 配置Spring监*器 -->
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml,classpath:application-security.xml</param-value>
    </context-param>


    权限配置文件内容如下:


<?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.2.xsd
                        http://www.springframework.org/schema/security
                        http://www.springframework.org/schema/security/spring-security-3.1.xsd">

   
    <http pattern="/login" security="none" />
    <http pattern="/resources/**" security="none" />
   

    <http auto-config="true" use-expressions="true" access-denied-page="/denied">
        <!-- default-target-url 指定了从登录页面登录后进行跳转的页面 always-use-default-target true表示登录成功后强制跳转
            authentication-failure-url 表示验证失败后进入的页面 login-processing-url 设置验证登录验证地址,如果不设置,默认是j_spring_security_check
            username-parameter,password-parameter 设置登录用户名和密*的请求name,默认:j_username,j_password
            default-target-url="/user/home" -->
        <form-login login-page="/login"
            always-use-default-target="true"
            authentication-failure-url="/login?error=1"
            authentication-success-handler-ref="successHandler" />
       
        <logout   logout-success-url="/login" />

        <!-- error-if-maximum-exceeded 后登陆的账号会挤掉第一次登陆的账号
            session-fixation-protection
            防止伪造sessionid攻击. 用户登录成功后会销毁用户当前的session.  
                创建新的session,并把用户信息复制到新session中. -->

        <session-management invalid-session-url="/login?error=3"
            session-fixation-protection="none">
            <concurrency-control max-sessions="1"
                error-if-maximum-exceeded="true" expired-url="/login?error=2" /><!-- 阻止第二次登录 -->
        </session-management>
        <custom-filter ref="appInterceptor" before="FILTER_SECURITY_INTERCEPTOR"/> 
    </http>


    <authentication-manager alias="appAuthenticationManager">
        <authentication-provider user-service-ref="userDetailsService">
        </authentication-provider>
    </authentication-manager>
   
    <beans:bean id="appInterceptor" class="cn.luxh.app.security.AppSecurityInterceptor">
        <beans:property name="authenticationManager" ref="appAuthenticationManager"/>
        <beans:property name="accessDecisionManager" ref="appAccessDescisionManager"/>
        <beans:property name="securityMetadataSource" ref="appSecurityMetadataSource"/>
    </beans:bean>
   
   
   
    <beans:bean id="userDetailsService" class="cn.luxh.app.security.UserDetailsServiceImpl" />
   
    <beans:bean id="appSecurityMetadataSource" class="cn.luxh.app.security.AppSecurityMetadataSource">
        <beans:constructor-arg name="roleService" ref="roleService"></beans:constructor-arg>
        <beans:constructor-arg name="resourceService" ref="resourceService"></beans:constructor-arg>
    </beans:bean>
   
    <beans:bean id="appAccessDescisionManager" class="cn.luxh.app.security.AppAccessDescisionManager"/>
   
    <beans:bean id="roleService" class="cn.luxh.app.service.RoleServiceImpl"/>
   
    <beans:bean id="resourceService" class="cn.luxh.app.service.ResourceServiceImpl"/>
   
    <!-- 登录成功业务处理 -->
    <beans:bean id="successHandler"
        class="cn.luxh.app.security.LoginAuthenticationSuccessHandler">
        <beans:property name="url" value="/index"></beans:property>
    </beans:bean>

</beans:beans>

  5、权限配置文件中的关键类

    1)UserDetailsServiceImpl


package cn.luxh.app.security;

import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 cn.luxh.app.domain.Role;
import cn.luxh.app.domain.User;
import cn.luxh.app.exception.UserException;
import cn.luxh.app.persistence.RoleMapper;
import cn.luxh.app.persistence.UserMapper;

public class UserDetailsServiceImpl implements UserDetailsService{
   
    private static Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class);
   
    @Autowired
    private UserMapper userMapper;
   
    @Autowired
    private RoleMapper roleMapper;
   
    /**
     * @param account 登录帐号
     */
    public UserDetails loadUserByUsername(String account)
            throws UsernameNotFoundException {
        log.info("登录账号:"+account);
        org.springframework.security.core.userdetails.User userDetails = null;
        try {
            User user = userMapper.selectByAccount(account);
            if(user == null) {
                throw new UserException("帐号:"+account+" 不存在!");
            }
            Collection<GrantedAuthority> grantedAuthorities = getGrantedAuthorities(user); 
           
            boolean enables = true; 
            boolean accountNonExpired = true; 
            boolean credentialsNonExpired = true; 
            boolean accountNonLocked = true;
            userDetails = new org.springframework.security.core.userdetails.User(user.getAccount(), user.getPassword(), enables, accountNonExpired, credentialsNonExpired, accountNonLocked, grantedAuthorities); 
        }catch(Exception e) {
            log.error(e.getMessage());
            e.printStackTrace();
        }
        return userDetails;
    }
   
    /**
     * 根据用户获取该用户拥有的角色
     * @param user
     * @return
     */
    private Set<GrantedAuthority> getGrantedAuthorities(User user) {
        Set<GrantedAuthority> grantedAuthorities = new HashSet<GrantedAuthority>(); 
        List<Role> roles = roleMapper.selectByUserId(user.getId());
        if(roles != null) {
            for(Role role : roles) { 
                grantedAuthorities.add(new SimpleGrantedAuthority(role.getName()));
            } 
        }
        return grantedAuthorities; 
    }

}

    2)AppSecurityInterceptor

View Code
    3)AppAccessDescisionManager

View Code
    4)AppSecurityMetadataSource

View Code
    5)LoginAuthenticationSuccessHandler

View Code
  6、其中资源表内容如下

              

  7、源*,含数据库文件和初始化值

        http://files.cnblogs.com/luxh/app4.rar

  8、在页面上的控制权限

    1)引入标签: <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

    2)使用标签:如下,审核*作时具有"ROLE_ADM"权限才可以看到。

<sec:authorize ifAnyGranted="ROLE_ADM">
           <li><a href="javascript:auditPage('${ctx}/task/auditPage?taskId=${task.taskId}')">审核</a></li>
</sec:authorize>

转自:http://www.nbtarena.com/Html/soft/201305/2098.html

分享到:
评论

相关推荐

    spring security3 中文版本

    ### Spring Security 3.0.1 中文版知识点解析 #### 一、Spring Security 3.0.1 概览 ##### 1.1 Spring Security 是什么? Spring Security 是一个强大的、高度可定制的身份验证和访问控制框架。它提供了许多功能...

    Spring Security3 简单demo

    在压缩包文件"SpringSecurity3"中,可能包含了以下内容: - `spring-security.xml`:这是主要的配置文件,包含了上述提到的所有配置。 - `web.xml`:可能包含了Spring Security过滤器链的配置,以便在Web应用启动时...

    spring security 官方文档

    10. **与其他Spring框架的集成**:Spring Security与Spring Boot、Spring MVC、Spring Data等其他Spring组件无缝集成,使得构建安全应用变得更加简单。 在Spring Security的官方文档中,包含了详细的配置指南、API...

    Spring Security简单Demo

    **Spring Security简介** Spring Security是Java领域中一个强大的安全框架,用于处理Web应用程序的安全性问题。它提供了一套全面的解决方案,包括身份验证、授权、会话管理以及防止常见的攻击,如跨站脚本(XSS)、...

    Spring Security如何使用URL地址进行权限控制

    Spring Security如何使用URL地址进行权限控制 Spring Security是一个功能强大且广泛应用的Java安全框架,它提供了许多功能,包括身份验证、授权、加密等。其中,权限控制是Spring Security的一个重要组件,它允许...

    springsecurity使用demo

    在本示例中,我们将探讨如何使用 SpringSecurity 构建一个基本的认证和授权流程。 首先,Spring Security 的核心组件包括认证(Authentication)和授权(Authorization)。认证涉及识别用户身份,而授权则是确定...

    springSecurity 实现传参

    2. **自定义登录页面**:Spring Security默认提供了一个简单的登录页面,但你可能希望使用自己的。你可以创建一个自定义的登录表单,其中包含用户输入的用户名和密码,以及可能的隐藏字段来保存用户登录前的URL。 3...

    spring security3 开发手册

    Spring Security的入门通常以一个简单的Hello World示例开始,通过这个示例用户可以了解如何配置过滤器,利用命名空间简化配置过程,并且完善整个项目结构。运行示例将帮助用户理解Spring Security的基本工作原理。 ...

    SpringSecurity 3配置文件

    在本文中,我们将深入探讨Spring Security 3的配置文件,以及如何理解和使用这些配置来增强应用的安全性。 首先,Spring Security的配置通常位于一个或多个XML文件中,这些文件通过`&lt;beans&gt;`标签定义了安全相关的...

    Spring Security 3 源码分析文档

    8. **集成Spring MVC**:Spring Security与Spring MVC的深度整合,使得在控制器层添加安全控制变得简单。通过源码,我们可以了解它们如何无缝对接。 9. **自定义安全配置**:Spring Security允许开发者通过XML或...

    spring security 3 多页面登录 小秘密小运气

    如果登录失败,Spring Security默认会显示一个简单的错误消息。通过重写`AuthenticationFailureHandler`,你可以提供更友好的错误反馈,如跳转到特定的错误页面或显示定制的错误信息。 4. **记住我功能**: ...

    SpringSecurity中文文档.zip

    SpringSecurity是Java开发领域中广泛使用的安全框架,用于保护Web应用程序免受各种安全威胁。它提供了全面的身份验证、授权和访问控制功能。本压缩包包含了两份重要的SpringSecurity中文文档,分别为“Spring ...

    SpringSecurity源码 SpringSecurity jar包 简单的Demo

    在本篇中,我们将深入探讨Spring Security的核心概念、架构和主要组件,以及如何通过简单的Demo来理解和应用这个框架。 首先,让我们了解Spring Security的基本架构。Spring Security的核心设计理念是采用过滤器链...

    SpringSecurity入门小demo(SSM+Spring Security)

    在 `HelloSpringSecurity` 文件中,你可能看到以下关键代码: - **WebSecurityConfigurerAdapter** 类:这是 Spring Security 提供的配置适配器,可以覆盖其方法来定制安全规则。 - `configure(HttpSecurity http)...

    Spring Security 教程(Spring Security Tutorial)1

    - 学习 Spring Security 的第一步通常是创建一个简单的 "Hello World" 应用,这通常涉及添加必要的依赖和配置,以便启动基础的安全功能。 3. **单元测试**: - 在安全相关的开发中,单元测试是必不可少的,因为它...

    基本的spring mvc + spring security实现的登录(无数据库)

    这个简单的示例为初学者提供了一个了解Spring MVC和Spring Security交互的基础平台,有助于理解这两个框架在实际项目中的作用和集成方式。通过深入研究和实践,可以进一步提升Web应用的安全性和可维护性。

    spring-security简单demo

    Spring Security 是一个强大...这个"spring-security简单demo"应该涵盖以上这些基本概念,帮助开发者快速上手Spring Security的配置和使用。通过运行和分析这个示例,你将能够更好地理解如何在实际项目中实现安全控制。

    springSecurity简易实例

    **Spring Security 简易实例** 在Java Web开发中,Spring Security是一个强大的、高度可定制的身份验证和访问控制框架。本实例将基于JDK 1.7和Maven的阿里镜像来创建一个简单的Spring Security应用,以演示其基本...

    spring security 项目配置源码

    在这个"Spring Security 项目配置源码"中,我们有机会深入理解这个框架如何在实际项目中配置和使用。下面将详细介绍Spring Security的核心概念、配置过程以及如何在Eclipse环境中运行该项目。 1. **核心概念** - *...

Global site tag (gtag.js) - Google Analytics