目的是:系统内存在很多不同的用户,每个用户具有不同的资源访问权限,具体表现就是某个用户对于某个URL是无权限访问的。需要Spring Security忙我们过滤。

本文的很多命名都是参考链接博文的,最大的不同应该是本文是基于Spring boot,再次也向前人致敬!

由上一篇可知,FilterSecurityInterceptor是Spring Security进行URL权限判断的,FilterSecurityInterceptor又继承于AbstractSecurityInterceptor,由此可推测,我们可以新增一个Interceptor继承AbstractSecurityInterceptor,实现我们自己的权限校验逻辑。

查看父类及其代码逻辑,有几点必须要注意:
1、主要鉴权方法是调用父类中accessDecisionManager的decide值,所以我们需要自己实现一个accessDecisionManager
2、父类中存在抽象方法public abstract SecurityMetadataSource obtainSecurityMetadataSource();作用是获取URL及用户角色对应的关系。我们需要加入自己的实现。

以下是部分代码实现
主要拦截器JwtUrlSecurityInterceptor,需要在WebSecurityConfig(Spring Security配置)文件中注册
  1. //这个拦截器用来实现按照用户权限,对所请求的url进行拦截
  2. @Bean
  3. public JwtUrlSecurityInterceptor jwtUrlSecurityInterceptorBean() throws Exception{
  4. return new JwtUrlSecurityInterceptor();
  5. }
  6. @Override
  7. protected void configure(HttpSecurity httpSecurity) throws Exception {
  8. ...
  9. httpSecurity.addFilterBefore(jwtUrlSecurityInterceptorBean(), FilterSecurityInterceptor.class);
  10. ...
  11. }
实现自定义的accessDecisionManager
  1. package org.zerhusen.security.dsuri;
  2. import org.springframework.security.access.AccessDecisionManager;
  3. import org.springframework.security.access.AccessDeniedException;
  4. import org.springframework.security.access.ConfigAttribute;
  5. import org.springframework.security.authentication.InsufficientAuthenticationException;
  6. import org.springframework.security.core.Authentication;
  7. import java.util.Collection;
  8. /**
  9. * Created by dingshuo on 2017/6/28.
  10. */
  11. public class MyAccessDecisionManager implements AccessDecisionManager {
  12. @Override
  13. public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenticationException {
  14. System.out.println("自定义的接口");
  15. throw new AccessDeniedException("no right");
  16. }
  17. @Override
  18. public boolean supports(ConfigAttribute attribute) {
  19. return true;
  20. }
  21. @Override
  22. public boolean supports(Class<?> clazz) {
  23. return true;
  24. }
  25. }
实现自定义的资源SecurityMetadataSource 
  1. package org.zerhusen.security.dsuri;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.security.access.ConfigAttribute;
  4. import org.springframework.security.access.SecurityConfig;
  5. import org.springframework.security.web.FilterInvocation;
  6. import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
  7. import java.util.*;
  8. /**
  9. * Created by dingshuo on 2017/6/28.
  10. */
  11. public class MyInvocationSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {
  12. private static Map<String, Collection<ConfigAttribute>> resourceMap = null;
  13. @Autowired
  14. UrlMatcher urlMatcher;
  15. public MyInvocationSecurityMetadataSource() {
  16. //这里可以查数据库实现
  17. //注入dao即可
  18. resourceMap = new HashMap<String, Collection<ConfigAttribute>>();
  19. Collection<ConfigAttribute> atts = new ArrayList<ConfigAttribute>();
  20. ConfigAttribute ca = new SecurityConfig("ROLE_USER1");
  21. atts.add(ca);
  22. resourceMap.put("/index.jsp", atts);
  23. Collection<ConfigAttribute> attsno =new ArrayList<ConfigAttribute>();
  24. ConfigAttribute cano = new SecurityConfig("ROLE_NO");
  25. attsno.add(cano);
  26. resourceMap.put("/other.jsp", attsno);
  27. }
  28. @Override
  29. public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
  30. String url = ((FilterInvocation)object).getRequestUrl();
  31. Iterator<String> ite = resourceMap.keySet().iterator();
  32. while (ite.hasNext()) {
  33. String resURL = ite.next();
  34. if (url.equals("/protected")) {
  35. return resourceMap.get(resURL);
  36. }
  37. }
  38. return null;
  39. }
  40. @Override
  41. public Collection<ConfigAttribute> getAllConfigAttributes() {
  42. return null;
  43. }
  44. @Override
  45. public boolean supports(Class<?> clazz) {
  46. return true;
  47. }
  48. }
实现JwtUrlSecurityInterceptor
  1. package org.zerhusen.security.dsuri;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.security.access.AccessDecisionManager;
  5. import org.springframework.security.access.SecurityMetadataSource;
  6. import org.springframework.security.access.intercept.AbstractSecurityInterceptor;
  7. import org.springframework.security.access.intercept.InterceptorStatusToken;
  8. import org.springframework.security.authentication.AuthenticationManager;
  9. import org.springframework.security.web.FilterInvocation;
  10. import javax.servlet.*;
  11. import java.io.IOException;
  12. /**
  13. * Created by dingshuo on 2017/6/28.
  14. */
  15. public class JwtUrlSecurityInterceptor extends AbstractSecurityInterceptor implements
  16. Filter {
  17. @Autowired
  18. public void setMyAccessDecisionManager(){
  19. super.setAccessDecisionManager(myAccessDecisionManagerBean());
  20. }
  21. @Bean
  22. public MyAccessDecisionManager myAccessDecisionManagerBean(){
  23. return new MyAccessDecisionManager();
  24. }
  25. @Bean
  26. public MyInvocationSecurityMetadataSource myInvocationSecurityMetadataSourceBean(){
  27. return new MyInvocationSecurityMetadataSource();
  28. }
  29. @Override
  30. public void init(FilterConfig filterConfig) throws ServletException {
  31. }
  32. @Override
  33. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  34. FilterInvocation fi = new FilterInvocation(request, response, chain);
  35. invoke(fi);
  36. }
  37. @Override
  38. public void destroy() {
  39. }
  40. @Override
  41. public Class<?> getSecureObjectClass() {
  42. return FilterInvocation.class;
  43. }
  44. @Override
  45. public SecurityMetadataSource obtainSecurityMetadataSource() {
  46. return this.myInvocationSecurityMetadataSourceBean();
  47. }
  48. public void invoke(FilterInvocation fi) throws IOException, ServletException {
  49. InterceptorStatusToken token = super.beforeInvocation(fi);
  50. try {
  51. fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
  52. }finally {
  53. super.afterInvocation(token, null);
  54. }
  55. }
  56. }
如上是简单的URL权限控制

Spring Security-利用URL地址进行权限控制的更多相关文章

  1. spring boot系列--spring security (基于数据库)登录和权限控制

    先说一下AuthConfig.java Spring Security的主要配置文件之一 AuthConfig 1 @Configuration 2 @EnableWebSecurity 3 publ ...

  2. Spring Security实现统一登录与权限控制

    1  项目介绍 最开始是一个单体应用,所有功能模块都写在一个项目里,后来觉得项目越来越大,于是决定把一些功能拆分出去,形成一个一个独立的微服务,于是就有个问题了,登录.退出.权限控制这些东西怎么办呢? ...

  3. Spring Boot+Spring Security+JWT 实现 RESTful Api 权限控制

    摘要:用spring-boot开发RESTful API非常的方便,在生产环境中,对发布的API增加授权保护是非常必要的.现在我们来看如何利用JWT技术为API增加授权保护,保证只有获得授权的用户才能 ...

  4. Spring Security 动态url权限控制(三)

    一.前言 本篇文章将讲述Spring Security 动态分配url权限,未登录权限控制,登录过后根据登录用户角色授予访问url权限 基本环境 spring-boot 2.1.8 mybatis-p ...

  5. Spring Security实现基于RBAC的权限表达式动态访问控制

    昨天有个粉丝加了我,问我如何实现类似shiro的资源权限表达式的访问控制.我以前有一个小框架用的就是shiro,权限控制就用了资源权限表达式,所以这个东西对我不陌生,但是在Spring Securit ...

  6. spring boot系列03--spring security (基于数据库)登录和权限控制(下)

    (接上篇) 后台 先说一下AuthConfig.java Spring Security的主要配置文件之一 AuthConfig 1 @Configuration 2 @EnableWebSecuri ...

  7. Spring security用户URL权限之FilterSecurityInterceptor

    总: 用户通过浏览器发送URL地址,由FilterSecurityInterceptor判断是否具有相应的访问权限. 对于用户请求的方法权限,例如注解@PreAuthorize("hasRo ...

  8. Spring Security 基于URL的权限判断

    1.  FilterSecurityInterceptor 源码阅读 org.springframework.security.web.access.intercept.FilterSecurityI ...

  9. 基于Spring Security 的JSaaS应用的权限管理

    1. 概述 权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源.资源包括访问的页面,访问的数据等,这在传统的应用系统中比较常见.本文介绍的则是基于Saas系统 ...

随机推荐

  1. Node.js模拟发起http请求从异步转同步的5种方法

    使用Node.js模拟发起http请求很常用的,但是由于Node模块(原生和第三方库)提供里面的方法都是异步,对于很多场景下应用很麻烦,不如同步来的方便.下面总结了几个常见的库API从异步转同步的几种 ...

  2. switch或判断

    <?php $num1 = 1; $num2 = 2; function int($num){ switch($num){ case 1: case 2: echo "1或2" ...

  3. PHP生成唯一的促销/优惠/折扣码,由字母和数字组成。

    首先我们先搞清楚什么是促销/优惠/折扣码?它有什么用作: 每一个电子商务网站,现在有一种或多种类型的优惠/折扣/优惠券系统,给大家分享一下如何在PHP生成唯一的促销/折扣码.主要是实现一个优惠码系统, ...

  4. Spring → 《Spring程序开发》教材大纲

  5. springboot集成mongoDB 异常认证

    1.springboot连接mongoDB 出现异常认证 异常详情: com.mongodb.MongoSecurityException: Exception authenticating Mong ...

  6. 使用 Apachetop 实时监测web服务器运行状况

    转自 http://42.96.169.71/blog/2013/01/26/shi-yong-apachetop-shi-shi-jian-ce-webfu-wu-qi-yun-xing-zhuan ...

  7. PHPCMS快速建站系列之类别调用及类别显示页面

    在需要调用类别的地方,比如列表页,首先写循环前面写上一句: <?php $TYPE = getcache('type_content','commons');?> 这句就是把类别缓存加载进 ...

  8. More Effective C++: 02操作符

    05:谨慎定义类型转换函数 有两种函数允许编译器进行隐式类型转换:单参数构造函数(single-argument constructors)和隐式类型转换运算符.单参数构造函数是指只用一个参数即可以调 ...

  9. Linux使用注意事项

    1.Linux严格区分大小写 2.Linux中所有内容以文件形式保存,包括硬件 3.修改任何设置,若想永久生效,都需要修改配置文件(除非某些发现版已经默认设置为同时修改内存和硬盘数据). 4.Linu ...

  10. NPOI操作、导出Excel

    //使用NPOI操作Excel private void ExcelNPOI(System.Data.DataTable dt, HttpContext context) { IWorkbook wo ...