`
jaesonchen
  • 浏览: 309904 次
  • 来自: ...
社区版块
存档分类
最新评论

spring security 自定义数据库权限

 
阅读更多
	<bean id="filterSecurityInterceptor"
			class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
	    <property name="authenticationManager" ref="authenticationManager" />
	    <property name="accessDecisionManager" ref="affirmativeBased" />
	    <property name="securityMetadataSource" ref="securityMetadataSource" />
	</bean>
	<bean id="securityMetadataSource" class="com.jaeson.springstudy.security.URLFilterInvocationSecurityMetadataSource">
		<property name="resourceRepository" ref="resourceRepository" />
	</bean>
	<bean id="resourceRepository" class="com.jaeson.springstudy.security.ResourceRepository">
		<property name="dataSource" ref="dataSource" />
	</bean>
	<bean id="affirmativeBased" class="org.springframework.security.access.vote.AffirmativeBased">
		<constructor-arg type="java.util.List">
			<list>
		        <ref bean="expressionVoter" />
		        <ref bean="roleVoter" />
		        <ref bean="authenticatedVoter" />
			</list>
		</constructor-arg>
	</bean>
 	<bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter" />
 	<bean id="authenticatedVoter" class="org.springframework.security.access.vote.AuthenticatedVoter" />
	<bean id="expressionVoter" class="org.springframework.security.web.access.expression.WebExpressionVoter">
		<property name="expressionHandler" ref="expressionHandler" />
	</bean>
	<bean id="expressionHandler"
			class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler" />

 

package com.jaeson.springstudy.security;

import java.util.*;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;

public class ResourceRepository {
	
	private JdbcTemplate jdbcTemplate;
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	public Map<String,String> getURLResourceMapping() {
		
		String sql = "SELECT r2.resource_path as path, r1.rolename as auth FROM role_resource rr " + 
				"JOIN role r1 ON rr.role_id = r1.id " + 
				"JOIN resources r2  ON rr.resource_id = r2.id " + 
				"ORDER BY r2.priority DESC";
		
		Map<String, String> result = new LinkedHashMap<String, String>();
		
		List<Map<String, Object>> list = this.jdbcTemplate.queryForList(sql);
		for (Map<String, Object> row : list) {
			
			String path = (String) row.get("path");
			String auth = (String) row.get("auth");
			if (result.containsKey(path)) {
				
				String tmp = result.get(path);
				result.put(path, tmp + "," + auth);
			} else {
				
				result.put(path, auth);
			}
		}
		
		return result;
	}
}

 

package com.jaeson.springstudy.security;

import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Collections;
import java.util.Set;
import java.util.LinkedHashMap;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
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.matcher.RequestMatcher;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

public class URLFilterInvocationSecurityMetadataSource implements
		FilterInvocationSecurityMetadataSource, InitializingBean {

	protected final Logger logger = LoggerFactory.getLogger(getClass());
	
	//权限集合  
	private Map<RequestMatcher, Collection<ConfigAttribute>> requestMap;

	@Autowired
	private ResourceRepository resourceRepository;
	public void setResourceRepository(ResourceRepository resourceRepository) {
		this.resourceRepository = resourceRepository;
	}
	
	@Override
	public Collection<ConfigAttribute> getAttributes(Object object)
			throws IllegalArgumentException {
		
		final HttpServletRequest request = ((FilterInvocation) object).getRequest();
		for (Map.Entry<RequestMatcher, Collection<ConfigAttribute>> entry : requestMap
				.entrySet()) {
			if (entry.getKey().matches(request)) {
				return entry.getValue();
			}
		}
		return Collections.emptyList();
	}

	@Override
	public Collection<ConfigAttribute> getAllConfigAttributes() {
		
		Set<ConfigAttribute> allAttributes = new HashSet<ConfigAttribute>();

		for (Map.Entry<RequestMatcher, Collection<ConfigAttribute>> entry : requestMap
				.entrySet()) {
			allAttributes.addAll(entry.getValue());
		}

		return allAttributes;
	}

	@Override
	public boolean supports(Class<?> clazz) {
		return FilterInvocation.class.isAssignableFrom(clazz);
	}

	@Override
	public void afterPropertiesSet() throws Exception {
		
		this.requestMap = bindRequestMap();
	}

	public void refreshResuorceMap() {
		
		this.requestMap = bindRequestMap();
	}
	
	protected Map<RequestMatcher, Collection<ConfigAttribute>> bindRequestMap() {
		
		Map<RequestMatcher, Collection<ConfigAttribute>> map = 
				new LinkedHashMap<RequestMatcher, Collection<ConfigAttribute>>();
		
		Map<String, String> resourceMapping = this.resourceRepository.getURLResourceMapping();
		
		for (Map.Entry<String,String> entry : resourceMapping.entrySet()) {
			String key = entry.getKey();
			Collection<ConfigAttribute> atts = SecurityConfig.createListFromCommaDelimitedString(entry.getValue());
			map.put(new AntPathRequestMatcher(key), atts);
		}
		
		return map;
	}
}

 

 

分享到:
评论

相关推荐

    spring security自定义数据库小项目

    **Spring Security 自定义数据库小项目概述** Spring Security 是一个强大且高度可定制的身份验证和访问控制框架,用于保护 Java 应用程序。本项目旨在演示如何利用 Spring Security 的灵活性,将权限管理与数据库...

    Spring security 自定义密码加密方式的使用范例。

    Spring Security 是一个强大的Java安全框架,...通过这个项目,你可以深入理解Spring Security的工作原理,并学习如何自定义其核心组件。如果你对码云不熟悉,也可以选择其他版本控制系统,如Git,进行代码托管和协作。

    spring mvc 和spring security自定义登录

    本文将深入探讨如何结合Spring MVC和Spring Security来实现自定义登录功能。 首先,Spring MVC是Spring框架的一部分,它为构建基于HTTP的Web应用程序提供了模型-视图-控制器架构。通过使用Spring MVC,开发者可以...

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

    下面将详细阐述如何进行Spring Security的数据库权限管理配置。 1. **配置数据源** 在Spring Security中,我们需要一个数据源来连接到数据库,存储用户、角色和权限信息。在Spring Boot项目中,可以通过...

    springboot springsecurity动态权限控制

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

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

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

    spring security的学习-3. 自定义数据库表结构.doc

    自定义数据库表结构”的文档中,我们将探讨如何根据企业特定的需求来定制Spring Security的数据库表结构,并且如何初始化数据以及获取自定义的用户权限信息。Spring Security默认的表结构可能无法满足所有企业的...

    SpringSecurity 之自定义用户权限信息的存取

    本文将详细探讨SpringSecurity中关于自定义用户权限信息存取的实现方法,包括如何通过配置文件和数据库来管理用户的认证信息和权限数据。 首先,当我们谈论用户权限信息的存取,实际上是在处理两个方面的问题:用户...

    spring-security实现自定义登录认证.rar

    这样,Spring Security就可以基于JWT进行权限控制。 这个压缩包中的“demo”文件可能包含了以上所有步骤的代码示例,包括Spring Security的基本配置、自定义UserDetailsService、AuthenticationProvider以及JWT的...

    spring security 使用数据库管理资源

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

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

    【Spring Security 把授权信息写入数据库】 Spring Security是一个强大的安全管理框架,用于处理Java应用程序的安全需求,包括认证和授权。在从Acegi安全框架转换到Spring Security 2.0时,一个重要的变化就是如何...

    spring security 自定义动态权限

    当我们配置的 URL 拦截规则请求 URL 所需要的...动态管理权限规则就是我们将UR 拦截规则和访问 URI 所需要的权限都保存在数据库中,这样,在不修改源代码的情况下,只需要修改数据库中的数据,就可以对权限进行调整。

    spring security用数据库的示例

    在"spring security用数据库的示例"中,我们将深入探讨如何配置Spring Security以使用数据库进行用户管理和权限控制。 首先,Spring Security的核心组件包括Authentication(认证)和Authorization(授权)。认证是...

    springsecurity角色和权限

    让我们深入探讨Spring Security在处理角色和权限方面的一些关键概念。 1. **角色与权限基础** 在Spring Security中,"角色"是赋予用户的标识,表示用户在系统中的职责或权限集合。例如,"管理员"、"用户"等。"权限...

    SpringSecurity-数据库认证-简单授权

    在这个“SpringSecurity-数据库认证-简单授权”的主题中,我们将深入探讨如何结合SpringSecurity与数据库来实现用户身份验证和权限管理。 首先,我们需要理解SpringSecurity的核心组件。`Authentication`代表认证,...

    spring security实现动态授权

    通过分析这些代码,你可以理解如何将Spring Security与数据库集成,实现动态权限管理。 总的来说,Spring Security的动态授权功能使得权限管理变得更加灵活和高效。通过对源代码的适当修改,我们可以构建一个完全可...

    spring security用户权限项目

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

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

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

    spring security 数据库存储资源信息 记住我 支持AJAX

    在提供的压缩包文件"springsecurity_database"中,可能包含了示例代码、配置文件和其他相关资源,可以帮助你理解和实现上述功能。在实际项目中,你需要根据自己的需求调整和扩展这些示例,以构建一个符合业务场景的...

    spring security权限管理

    总的来说,理解并掌握Spring Security的权限管理机制,需要对`UserDetails`接口、配置文件的解析以及数据库交互有深入的认识。通过自定义用户实体、配置安全规则以及实现数据访问层,我们可以构建出满足业务需求的...

Global site tag (gtag.js) - Google Analytics