在一个系统中,权限的拦截是很常见的事情,通常情况下我们都是基于url进行拦截。那么在spring security中应该怎么配置呢。
大致步骤如下:
1、用户登录成功后我们需要拿到用户所拥有的权限,并保存到当前的认证对象中。
|- SecurityUserDetailServiceImpl#loadUserByUsername(String) 在根据用户名获取到用户后,一起查询出用户拥有的权限
2、当用户访问某一个url时,我们需要判断当前访问的url所需要的权限当前认证的用户是否拥有。
|- 系统加载时需要加载出 所有的资源(url)与之对应的权限
|- 用户访问url时,如果是有权限判断的url,取出url所需要的权限和用户当前的权限进行一个比对
> 成功 放行
> 无权 拒绝
3、修改spring security的配置文件,增加我们自己的权限判断
那么我们怎么知道我们拥有哪些权限呢?我们可以基于一个简单的rbac的权限模型来进行实现。系统中存在 用户(sys_user),角色(sys_role),资源(sys_resources),用于和角色多对多关系(sys_user_role),角色和资源也是多对多关系(sys_role_resource)。
在资源这张表中记录着url和url所需要的权限。
基于上一篇 "认识 spring security" 我们来做一个简单的修改,实现url权限的拦截。
一、修改SecurityUserDetailServiceImpl这个类,在用户登录成功时,加入用户所拥有的权限
注:在上图中可以看到用户拥有 admin、01、0102这三个权限
二、编写一个方法实现系统中的url权限判断
/** * 系统中的安全资源决策 * * @描述 * @作者 huan * @时间 2017年11月4日 - 下午12:32:11 */ @Slf4j @Component("securityResourceDecisionHandler") public class SecurityResourceDecisionHandler { /** * 保存的是url以及url所需要的权限 */ private static final Map<String, List<GrantedAuthority>> URL_AUTHS = new ConcurrentHashMap<>(); static { URL_AUTHS.put("/xx", Arrays.asList(new SimpleGrantedAuthority("01"))); URL_AUTHS.put("/xx/x", Arrays.asList(new SimpleGrantedAuthority("01"))); URL_AUTHS.put("/yy", Arrays.asList(new SimpleGrantedAuthority("0102"))); URL_AUTHS.put("/zz/**", Arrays.asList(new SimpleGrantedAuthority("010201"))); } AntPathMatcher pathMatcher = new AntPathMatcher(); /** * 自定义决策 * * @param authentication * 认证对象 * @param request * 请求的request对象 * @return true:有权限访问 false:无权限访问 */ public boolean auth(Authentication authentication, HttpServletRequest request) { String uri = request.getRequestURI().replace(request.getContextPath(), ""); for (Entry<String, List<GrantedAuthority>> entry : URL_AUTHS.entrySet()) { if (pathMatcher.match(entry.getKey(), uri)) { Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities(); for (GrantedAuthority grantedAuthority : authorities) { if (entry.getValue().contains(grantedAuthority)) { return true; } } log.warn("当前访问的uri:{},需要的权限是:{},当前用户无此权限.", uri, entry.getValue()); return false; } } // 访问的是没有配置权限的功能,必须要登录用户才可以进行访问 if (authentication.isAuthenticated() && !Objects.equals("anonymousUser", authentication.getPrincipal())) { return true; } // 没有登录,直接返回false return false; } }
注: 注意一下 /zz/** 这个url所需要的权限是010201,而这个权限当前登录用户是没有的
三、修改spring security的配置文件
四、查看结果(/zz/**这个url需要的权限为010201,而我们只有01,0102,这2个权限,所有就报了无权访问这个。)
到此,一个基于简单的url拦截的实现就完成了。
相关推荐
在本文中,我们将探讨如何使用Spring Security来实现URL地址的权限控制。 权限控制是指根据用户的角色和权限来控制用户对资源的访问权限。例如,在一个Web应用程序中,可能存在多个用户,每个用户都有不同的角色和...
在这个“springboot springsecurity动态权限控制”的主题中,我们将深入探讨如何在Spring Boot项目中集成Spring Security,实现动态权限控制,让菜单权限的管理更加灵活和高效。 首先,我们需要理解Spring Security...
在本资源中,我们关注的是如何通过SpringSecurity来实现一个简单的权限管理系统。以下将详细解释SpringSecurity的核心概念和配置步骤,以及如何利用提供的包进行实际应用。 1. **身份验证(Authentication)**:这...
总结,Spring Security 3.1提供了一套强大且灵活的安全解决方案,包括URL和方法拦截、用户数据的数据库存储,以及通过Maven进行依赖管理。通过学习和实践,我们可以有效地保护我们的Web应用程序。
在本文中,我们将深入探讨如何使用Spring Boot、Spring Security和Thymeleaf这三个强大的Java技术栈组件来实现一个全面的权限管理系统,同时涵盖Remember-Me功能。Spring Boot简化了Spring应用的开发,Spring ...
SpringBoot集成Spring Security是现代Java应用中常见的安全框架组合,它们为开发者提供了强大的权限管理和访问控制功能。Spring Security是一个全面的、高度可配置的安全框架,它涵盖了认证、授权以及会话管理等多个...
本项目结合了SpringBoot、SpringSecurity以及JPA(Java Persistence API),实现了用户角色权限的登录认证功能。以下是关于这些技术及实现过程的详细讲解。 1. **SpringBoot**:SpringBoot简化了Spring应用的初始...
在本项目中,我们将探讨如何利用Spring Boot、JWT(JSON Web Token)、Spring Security和Redis来实现一个高效的登录拦截和权限认证系统,同时实现全局异常处理和统一的API返回风格。 1. **Spring Boot**:Spring ...
在Spring Security配置中,我们可以定义安全拦截规则,如`@Secured`或`@PreAuthorize`注解,来指定哪些方法需要特定的角色或权限才能访问。此外,我们还可以通过`http.authorizeRequests()`方法定义URL级别的访问...
本项目基于Spring,整合Spring的security模块,实现用户管理和权限控制,是一套较为通用的权限控制功能,主要内容如下: 1.登录,包括“记住我”的功能; 2.加密,存储的密码不采用明文,初始密码1234; 3.拦截器...
**Spring Security 用户权限项目概述** Spring Security 是一个强大的安全框架,专为 Java 应用程序设计,用于处理身份验证和授权。在这个项目中,它被用来实现用户权限管理,确保只有授权的用户才能访问特定的资源...
Spring Security 的配置主要通过 security.xml 文件实现。security.xml 文件中定义了身份验证、授权和访问控制等配置项。 六、Spring Security 的架构 Spring Security 的架构主要包括以下几层: * Presentation ...
这个简单的示例为初学者提供了一个了解Spring MVC和Spring Security交互的基础平台,有助于理解这两个框架在实际项目中的作用和集成方式。通过深入研究和实践,可以进一步提升Web应用的安全性和可维护性。
在实际应用中,拦截器可以结合Spring Security进行权限控制,例如检查用户是否已登录,或者在处理完请求后记录操作日志。还可以利用`ModelAndView`对象在`postHandle`方法中修改视图数据,以实现动态页面布局或添加...
**Spring Security 3 多用户登录实现详解** Spring Security 是一个强大的、高度可定制的身份验证和访问控制框架,广泛应用于Java EE平台上的安全解决方案。在本文中,我们将深入探讨如何在Spring Security 3中实现...
- 用户提交登录请求,请求被SpringSecurity的过滤器拦截。 - 认证过滤器(如`UsernamePasswordAuthenticationFilter`)提取用户名和密码,并调用`UserDetailsService`进行验证。 - 验证成功后,创建`...
总之,这个"spring security 完整项目实例"涵盖了Spring Security的核心组件和用法,包括用户管理、身份验证、权限控制、会话管理等多个方面。通过学习和实践这个项目,开发者能够深入理解Spring Security的工作原理...
在"spring security权限管理"这个主题中,我们将深入探讨如何利用Spring Security来实现复杂而灵活的权限控制。 首先,`MyUser.java`可能是自定义的用户实体类,它通常会包含用户的基本信息,如用户名、密码、角色...
- 在Spring Boot项目中,Spring Security 可以通过自动配置快速启动,开发者只需少量配置就能实现复杂的安全需求。 这三份资料——"实战Spring Security 3.x.pdf"、"Spring Security 3.pdf" 和 "Spring Security...
在"SpringSecurity权限管理开发手册.pdf"和"SpringSecurity权限管理开发手册.pdf.txt"中,你将找到更多关于如何配置和使用SpringSecurity进行权限管理的详细信息,包括配置XML或Java配置、定义访问规则、处理未授权...