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

Spring security用户权限数据库配置

阅读更多

  关于安全性服务,有两个重要的概念需要理解,一是认证,即判断用户是否在应用程序中存在,二是授权,即判断用户是否有权限访问资源。  

 

  Spring security为我们提供的HTTP Basic,Digest等认证服务,因为要在配置文件中对用户和权限进行配置,所以局限性很强。除此之外,它还允许我们在数据库中对用户和权限进行配置。那么如何实现呢?

 

  在系统中定义用户,角色,权限这三种实体,一个用户可以拥有多个角色,一个角色可以被多个用户拥有,所以用户与角色之间是多对多的关系,为了易于理解,这里加入第三种实体权限,作为用户和角色的中间关联实体,把用户与角色间的多对多关系拆为两个一对多的关联关系。这样一个用户就对应着多个权限,一个权限对应着一个用户,而一个角色对应着多个权限,一个权限对应着一个角色。

 

  一。User.java

 

package com.template.security;

import java.util.List;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 11-7-28
 * Time: 下午9:46
 * To change this template use File | Settings | File Templates.
 */
public class User {
    private Integer id;
    private String username;
    private String password;
    private Boolean enabled;

    private List<Authority> authorities;

    public User() {
    }
}

 

 

  二。User.hbm.xml

 

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping default-access="field">

    <class name="com.template.security.User" table="user" dynamic-insert="true" dynamic-update="true">
        <id name="id" column="id" type="java.lang.Integer">
            <generator class="native"/>
        </id>
        <property name="username" column="username" type="java.lang.String"/>
        <property name="password" column="password" type="java.lang.String"/>
        <property name="enabled" column="enabled" type="java.lang.Boolean"/>

        <bag name="authorities">
            <key column="userid"/>
            <one-to-many class="com.template.security.Authority"/>
        </bag>
    </class>

</hibernate-mapping>

 

 

  三。Role.java

 

package com.template.security;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 11-7-28
 * Time: 下午9:47
 * To change this template use File | Settings | File Templates.
 */
public class Role {
    private Integer id;
    private String name;

    public Role() {
    }
}

 

 

  四。Role.hbm.xml

 

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping default-access="field">

    <class name="com.template.security.Role" table="role" dynamic-insert="true" dynamic-update="true">
        <id name="id" column="id" type="java.lang.Integer">
            <generator class="native"/>
        </id>
        <property name="name" column="name" type="java.lang.String"/>
    </class>

</hibernate-mapping>

 

 

  五。Authority.java

 

package com.template.security;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 11-7-28
 * Time: 下午9:47
 * To change this template use File | Settings | File Templates.
 */
public class Authority {
    private Integer id;
    private User user;
    private Role role;

    public Authority() {
    }
}

 

 

  六。Authority.hbm.xml

 

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping default-access="field">

    <class name="com.template.security.Authority" table="authority" dynamic-insert="true" dynamic-update="true">
        <id name="id" column="id" type="java.lang.Integer">
            <generator class="native"/>
        </id>
        <many-to-one name="user" column="userid" class="com.template.security.User"/>
        <many-to-one name="role" column="roleid" class="com.template.security.Role"/>
    </class>

</hibernate-mapping>

 

 

  七。security.xml

 

<?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">  

    <beans:import resource="datasource.xml"/>

    <http use-expressions="true">  
        <intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')" requires-channel="http"/>
        
        <form-login/>
        <remember-me/>
    </http>  
    
    <authentication-manager>  
        <authentication-provider>  
            <jdbc-user-service data-source-ref="dataSource"
              users-by-username-query="select username,password,enabled as status from user where username=?"
              authorities-by-username-query="select u.username,r.name as authority from user u join authority a on a.userid=u.id join role r on r.id=a.roleid where u.username=?"/>
        </authentication-provider>  
    </authentication-manager>  
  
</beans:beans>

  这里需要重点了解这样几个元素。第一个就是jdbc-user-service,这是用来配置利用数据库进行用户权限认证服务的,data-source-ref则是用来说明使用的数据库连接等相关属性,users-by-username-query则是认证用户使用的,

authorities-by-username-query则是获取用户授权的,intercept-url可以用来定义要保护的访问路径,当然如果配置文件中有多个intercept-url,其中有些是重复的,那么Spring会以位置最靠上的作为标准来判断,access则定义了哪些角色可以访问,还有其它一些属性以后再做进一步理解,现在这些已经够用了。只要做到认证和授权,那么我们的安全框架也就基本搭建完成了。

 

  八。data.ddl

 

INSERT INTO user(id,username,password,enabled) VALUES (1,"ZhongGang","ZhongGang",true);
INSERT INTO user(id,username,password,enabled) VALUES (2,"GangGang","GangGang",true);
INSERT INTO user(id,username,password,enabled) VALUES (3,"ZhongZhong","ZhongGang",false);

INSERT INTO role(id,name) VALUES (1,"ROLE_ADMIN");
INSERT INTO role(id,name) VALUES (2,"ROLE_SUPERUSER");

INSERT INTO authority(id,userid,roleid) VALUES (1,1,1);
INSERT INTO authority(id,userid,roleid) VALUES (2,2,2);
INSERT INTO authority(id,userid,roleid) VALUES (3,3,1);

  这是我使用的模拟数据。   

 

   当然这里需要在web.xml里面配置springSecurityFilterChain,可以参见我的另一篇博文Spring security HTTP Basic。

3
5
分享到:
评论
2 楼 Crazy_Robin 2014-01-19  
楼主的文章几乎每篇都是精华啊!真的值得好好研究一下!
1 楼 _s45 2012-03-07  
按照楼主的方法做了,实验成功,非常感谢

相关推荐

    SpringSecurity 2 权限基于数据库--完整DEMO(带数据库文件)

    本DEMO展示了如何将SpringSecurity与SSH(Spring、Struts2、Hibernate)集成,实现基于数据库的权限管理。在这个完整的示例中,我们将探讨以下几个关键知识点: 1. **SpringSecurity配置**: - SpringSecurity的...

    springboot springsecurity动态权限控制

    在这个“springboot springsecurity动态权限控制”的主题中,我们将深入探讨如何在Spring Boot项目中集成Spring Security,实现动态权限控制,让菜单权限的管理更加灵活和高效。 首先,我们需要理解Spring Security...

    Spring Security 基于数据库的权限管理配置

    在基于数据库的权限管理配置中,Spring Security 允许我们存储、管理和验证用户的访问权限,这使得权限控制更加灵活和可扩展。下面将详细阐述如何进行Spring Security的数据库权限管理配置。 1. **配置数据源** 在...

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

    - **配置**:通常通过Java配置或XML配置来设置Spring MVC的组件,如定义映射路径、拦截器等。 - **MVC模式**:Model代表业务数据,View负责渲染视图,Controller处理用户请求并协调Model和View。 2. **Spring ...

    Spring Security 把授权信息写入数据库

    通过这样的配置,Spring Security能够动态地从数据库中加载用户的授权信息,而不再依赖XML配置。 总结,Spring Security通过数据库存储授权信息,使得安全配置更加灵活,同时降低了维护成本。通过自定义`...

    spring security用户权限项目

    **Spring Security 用户权限项目概述** Spring Security 是一个强大的安全框架,专为 Java 应用程序设计,用于处理身份验证和授权。在这个项目中,它被用来实现用户权限管理,确保只有授权的用户才能访问特定的资源...

    SpringBoot集成Spring Security实现权限控制【完整源码+数据库】

    总的来说,这个项目为学习者提供了一个实际的、完整的SpringBoot集成Spring Security的示例,通过它,你可以了解如何配置和使用Spring Security进行权限控制,同时掌握如何将数据库集成到Spring Boot应用中。...

    spring-security使用数据库用户认证

    在本主题中,我们将深入探讨如何使用Spring Security与数据库配合,实现用户认证。这一过程涉及多个步骤,包括配置、数据库模型、用户DetailsService 和权限控制。 1. **配置Spring Security** 在Spring Security...

    bean配置跑spring security(mysql数据库)_spring security例子

    在这个例子中,我们将探讨如何将Spring Security与MySQL数据库结合使用,通过bean配置来实现用户认证和权限管理。首先,我们需要理解Spring Security的基本架构,它由一系列组件构成,如AuthenticationManager负责...

    spring security 读取数据库权限信息

    项目自身的权限信息结合spring security 框架的实现。 本DEMO只包括从数据库读取登录认证信息,认证通过后 从数据库读取授权信息来控制用户的访问.权限元素包括 用户,角色,菜单以及这三者的关系。 本DEMO使用了...

    spring security实现动态授权

    然而,通过动态授权,我们可以将用户、角色和资源信息存储在数据库中,允许在运行时动态配置权限,而无需重启服务,从而极大地提高了灵活性。 动态授权的核心在于权限模型的设计。在Spring Security中,我们通常...

    springBoot+security+mybatis 实现用户权限的数据库动态管理

    在本文中,我们将深入探讨如何使用Spring Boot、Spring Security和MyBatis这三大技术栈来实现用户权限的数据库动态管理。这是一个常见的需求,在许多企业级应用中,动态管理用户权限可以提高系统的灵活性和可扩展性...

    spring security与数据库交互实现简单例子

    在这个简单的例子中,我们将探讨如何利用Spring Security与数据库进行交互来实现用户认证和授权。 首先,`applicationContext-security.xml`是Spring Security的配置文件,它定义了安全相关的bean和规则。这个文件...

    Spring Security 安全实例-数据库简单应用(用户从数据库中获取)

    通过Spring Security,我们可以方便地实现用户登录、权限控制、会话管理等功能,同时支持多种认证机制,包括基于数据库的用户信息存储。 ### 2. 数据库用户存储配置 在传统的Spring Security配置中,用户信息通常...

    Spring Security 3连接数据库查询实例

    为了连接数据库查询,Spring Security需要配置一个`UserDetailsService`接口的实现,这个接口用于获取用户信息。通常,我们会创建一个自定义的实现类,比如`MyUserDetailsService`,并在此类中从数据库查询用户信息...

    spring security 使用数据库管理资源

    标题 "spring security 使用数据库管理资源" 指的是在Spring Security框架中,通过数据库来存储和管理权限与资源的相关配置。这一做法使得安全控制更为灵活,可以动态地更新和扩展系统的访问控制。Spring Security是...

    SpringBoot + SpringSecurity + JPA 实现用户角色权限登录认证

    在项目中,它可能负责定义如何使用JPA来操作用户角色和权限数据,以及如何配置SpringSecurity的过滤规则。 在实际的实现过程中,开发者首先会创建一个用户实体(User),并关联角色实体(Role)。每个角色都有多个...

    Spring Security in Action

    Spring Security 实践指南 ...* 高度可配置性:Spring Security 的配置项非常灵活,可以根据实际需求进行配置。 Spring Security 是一个功能强大且灵活的安全框架,广泛应用于 Java 应用开发中。

    Spring Security 安全权限管理手册.pdf

    - 解释如何修改Spring Security的配置文件来集成数据库,以实现动态化的权限管理。 - **2.2 数据库表结构** - 详细介绍用于存储用户信息及权限的数据库表的设计方案,包括必要的字段及其含义。 **3. 自定义...

    SpringSecurity权限管理

    在"SpringSecurity权限管理开发手册.pdf"和"SpringSecurity权限管理开发手册.pdf.txt"中,你将找到更多关于如何配置和使用SpringSecurity进行权限管理的详细信息,包括配置XML或Java配置、定义访问规则、处理未授权...

Global site tag (gtag.js) - Google Analytics