1.spring security 过滤器链

​ spring security中的除了用户登录校验相关的过滤器,最后还包含了鉴权功能的过滤器,还有匿名资源访问的过滤器链,相关的图解如下:

2.控制授权的相关类

​ 这里是整个spring security的过滤器链中的授权流程中控制权限的类的相关图示:

​ 这里主要是从AccessDecisionVoter的投票者(译称)把信息传递给投票管理者AccessDecisionManager,最终来判断是过还是不过(也就是有没有权限).有两种可能的类:

​ 1.不管有多少请求投票不过,只要有一个过就可以通过(UnanimousBased);

​ 2.不管有多少请求投票通过,只要有一个不通过就不让通过(AffirmativeBased);

​ 3.比较投通过和不通过的个数,谁多久就按照谁的方式来(Consensusbased).

​ 这里可以可能听起来有点绕,但实际上就是三种控制权限的方式类,我们可以认为Spring security已经帮我们做好了最终的判断,我们只需要当一个旁观者即可.

​ 我们再来关注SecurityContextHolder这个类,他会将我们的权限信息封装到Authentication中,SecurityConfig则是相关的Spring security的配置信息,这个类会将相关的信息传递到ConfigAttribute中.

3.配置简单的权限

​ 这个在身份信息固定,并且不会经常变动的情况下可以按照如下配置,否则不建议这么做,这里只适用于简单的场景.

MyUserDetailsService:

private SocialUserDetails buildUser(String userId) {
// 根据用户名查找用户信息
//根据查找到的用户信息判断用户是否被冻结
/**
* 可以从数据库查出来用户名和密码进行比对,为了方便我这里就直接固定了
*/
String password = passwordEncoder.encode("123456");
logger.info("数据库密码是:"+password);
//注意这里配置角色的时候需要加ROLE_前缀
return new SocialUser(userId, password,
true, true, true, true,
AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_ADMIN"));
}

BrowserSecurityConfig:

//这里是硬编码权限 只限于简单的用户权限 这里的角色名称严格区分大小写
//这里可以指定HttpMethod 如HttpMethod.GET,
.antMatchers("/user/**").hasRole("ADMIN")
.anyRequest() //所有请求
.authenticated() //都需身份认证

4.权限表达式

​ 之前我们一直都有用到权限表达式,比如最常用的permitAll和Authenticated,这个权限表达式就是允许所有都能访问的意思,其他的相关的权限表达式如下所示:

这里可以改写权限的表达如下:

.antMatchers("/user/**").access("hasRole('ADMIN') and hasIpAddress('XXXXXX')")
.anyRequest() //所有请求
.authenticated() //都需身份认证

5.spring security控制授权代码封装

![](https://img2018.cnblogs.com/blog/1373932/201905/1373932-20190504192151567-564940247.png)

代码相关:

AuthorizeConfigProvider:

/**
* 这个是授权的类
*/
public interface AuthorizeConfigProvider { void config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config);
}

CityAuthorizeConfigProvider:

//配置permitAll的路径
@Component
public class CityAuthorizeConfigProvider implements AuthorizeConfigProvider {
@Autowired
private SecurityProperties securityProperties;
@Override
public void config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) {
config.antMatchers(
"/static/**","/page/login","/page/failure","/page/mobilePage",
"/code/image","/code/sms","/authentication/mobile",securityProperties.getBrower().getSignUPUrl(),
"/user/register","/page/registerPage","/page/invalidSession","/page/logoutSuccess",securityProperties.getBrower().getSignOutUrl() )
.permitAll();
}
}

AuthorizeConfigManager:

/**
* AuthorizeConfigManager
*/
public interface AuthorizeConfigManager {
void config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config);
}

CityAuthorizeConfigManager:

@Component
public class CityAuthorizeConfigManager implements AuthorizeConfigManager { @Autowired
private Set<AuthorizeConfigProvider> authorizeConfigProviders; @Override
public void config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) {
for (AuthorizeConfigProvider authorizeConfigProvider : authorizeConfigProviders) {
authorizeConfigProvider.config(config);
}
//除了自己配置的CityAuthorizeConfigProvider的内容外 其他的都需要认证
config.anyRequest().authenticated();
}
}

在user中我们可以配置访问的页面权限:

DemoAuthorizeConifgProvider:

@Component
public class DemoAuthorizeConifgProvider implements AuthorizeConfigProvider { @Override
public void config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) { config.antMatchers("/demo.html","/user/**")
.hasRole("ADMIN");
}
}

注意在BrowserSecurityConfig中注释掉相关的代码后需要加入如下代码:

@Autowired
private AuthorizeConfigManager authorizeConfigManager; 在configure方法中调用:
authorizeConfigManager.config(http.authorizeRequests());

配置完后我们登陆进来,访问http://localhost:8060/demo.html 显示403权限拒绝,这个就说明权限生效了

4.项目git地址

(喜欢记得点星支持哦,谢谢!)

https://github.com/fengcharly/spring-security-oauth2.0

[原创]SpringSecurity控制授权(鉴权)功能介绍的更多相关文章

  1. YAPI接口自动鉴权功能部署详解

    安装准备 以下操作,默认要求自己部署过yapi,最好是部署过yapi二次开发环境. 无论是选择在线安装或者是本地安装,都需要安装client工具. 1.yapi-cli:npm install yap ...

  2. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-1.数据信息安全--微信授权一键登录功能介绍

    笔记 1.数据信息安全--微信授权一键登录功能介绍 简介:讲解登录方式优缺点和微信授权一键登录功能介绍         1.手机号或者邮箱注册             优点:              ...

  3. 基于SpringAop的鉴权功能

    什么是 AOP 首先我们先了解一下什么是AOP,AOP(Aspect Orient Programming),直译过来就是面向切面编程.AOP是一种编程思想,是面向对象编程(OOP)的一种补充.面向对 ...

  4. 「快学springboot」集成Spring Security实现鉴权功能

    Spring Security介绍 Spring Security是Spring全家桶中的处理身份和权限问题的一员.Spring Security可以根据使用者的需要定制相关的角色身份和身份所具有的权 ...

  5. 【Spring Cloud & Alibaba 实战 | 总结篇】Spring Cloud Gateway + Spring Security OAuth2 + JWT 实现微服务统一认证授权和鉴权

    一. 前言 hi,大家好~ 好久没更文了,期间主要致力于项目的功能升级和问题修复中,经过一年时间的打磨,[有来]终于迎来v2.0版本,相较于v1.x版本主要完善了OAuth2认证授权.鉴权的逻辑,结合 ...

  6. SpringBoot+JWT+SpringSecurity+MybatisPlus实现Restful鉴权脚手架

    若图片查看异常,请前往掘金查看:https://juejin.im/post/5d1dee34e51d4577790c1cf4 前言 JWT(json web token)的无状态鉴权方式,越来越流行 ...

  7. 深入理解k8s中的访问控制(认证、鉴权、审计)流程

    Kubernetes自身并没有用户管理能力,无法像操作Pod一样,通过API的方式创建/删除一个用户实例,也无法在etcd中找到用户对应的存储对象. 在Kubernetes的访问控制流程中,用户模型是 ...

  8. vue项目中的登录鉴权

    用vue做一个简单的登录鉴权功能. 项目目录结构如下: Login 组件 登录成功后做本地存储和store存储,并进行跳转. Login.vue关键代码: async handleLogin(e) { ...

  9. 【Gin-API系列】Gin中间件之鉴权访问(五)

    在完成中间件的介绍和日志中间件的代码后,我们的程序已经基本能正常跑通了,但如果要上生产,还少了一些必要的功能,例如鉴权.异常捕捉等.本章我们介绍如何编写鉴权中间件. 鉴权访问,说白了就是给用户的请求增 ...

随机推荐

  1. vue中利用Promise封装jsonp并调取数据

    Promise就是一个给一步操作提供的容器,在这个容器里,有两个阶段无法改变的阶段,第一个阶段就是Pending(进行),第二个阶段就是结果阶段,包含Fulfilled(成功).Rejected(失败 ...

  2. bootstrap的表单form

    (1)默认表单 <form> <div class="form-group"> <label class="control-label&qu ...

  3. Linux---基本目录与文件命令

    一.目录 1.显示工作目录命令pwd 2.改变工作目录命令cd 3.创建目录命令mkdir 二.文件 1.创建空文件命令touch 2.显示文件列表ls 3.复制文件或目录命令cp 4.删除文件或目录 ...

  4. 动态规划算法模板和demo

    366. 斐波纳契数列 中文 English 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列 ...

  5. 201871010101-陈来弟《面向对象程序设计(Java)》第八周学习总结

    实验七 接口的定义与使用 第一部分:理论知识 一.接口.lambda和内部类:  Comparator与comparable接口: 1.comparable接口的方法是compareTo,只有一个参数 ...

  6. echo和printf打印输出

    [root@node2 scprits]# echo Hello World! Hello World! [root@node2 scprits]# echo 'Hello World!' Hello ...

  7. LeetCode237-Delete_Node_In_A_Linked_List

    delete-node-in-a-linked-list public void deleteNode(ListNode node) { node.val = node.next.val; node. ...

  8. 图学Kubernetes

    所有图片来自:Kubernetes Patterns: Reusable Elements for Designing Cloud-Native Applications 本文图片摘要曾经在某大厂内网 ...

  9. LeetCode 79. Word Search单词搜索 (C++)

    题目: Given a 2D board and a word, find if the word exists in the grid. The word can be constructed fr ...

  10. windwos文件句柄数限制

    1.修改注册表,位置如下: HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Windows 2.设置 1.GDIProc ...