Spring Boot -Shiro配置多Realm
核心类简介
xxxToken:用户凭证 xxxFilter:生产token,设置登录成功,登录失败处理方法,判断是否登录连接等 xxxRealm:依据配置的支持Token来认证用户信息,授权用户权限
核心配置
Shrio整体配置:ShrioConfig.java
@Bean
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
Map<String, Filter> filters = shiroFilterFactoryBean.getFilters();
//将自定义 的FormAuthenticationFilter注入shiroFilter中
filters.put("authc", new AuthenticationFilter());
filters.put("wechat",new ExWechatAppFilter());
shiroFilterFactoryBean.setFilters(filters);
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
...
//建立url和filter之间的关系
filterChainDefinitionMap.put("/wechat/**","wechat");
filterChainDefinitionMap.put("/**", "authc");
...
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
}
@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setAuthenticator(exModularRealmAuthenticator());
List<Realm> realms = new ArrayList<>();
//设置多Realm
realms.add(systemRealm());
realms.add(wechatAppRealm());
securityManager.setRealms(realms);
securityManager.setCacheManager(ehCacheManager());
securityManager.setRememberMeManager(cookieRememberMeManager());
return securityManager;
}
//重要!!定义token与Realm关系,设置认证策略
public MyModularRealmAuthenticator www.tianjuyuLe.cn myModularRealmAuthenticator(){
MyModularRealmAuthenticator authenticator = new MyModularRealmAuthenticator();
FirstSuccessfulStrategy strategy = new FirstSuccessfulStrategy();
authenticator.setAuthenticationStrategy(strategy);
return authenticator;
}
@Bean
public SystemRealm systemRealm() {
SystemRealm systemRealm = new SystemRealm();
systemRealm.setAuthorizationCachingEnabled(true);
systemRealm.setAuthorizationCacheName("authorization");
systemRealm.setCredentialsMatcher(hashedCredentialsMatcher());
return systemRealm;
}
@Bean
public WechatAppRealm WechatAppRealm( www.dfgjpt.com){
WechatAppRealm wechatAppRealm www.huarenyl.cn= new WechatAppRealm();
wechatAppRealm.setAuthorizationCachingEnabled(false);
return WechatAppRealm;
}
Realm,Token关联关系配置:MyModularRealmAuthenticator.java
public class MyModularRealmAuthenticator extends ModularRealmAuthenticator {
@Override
protected AuthenticationInfo www.yongshi123.cn doAuthenticate(www.tiaotiaoylzc.com AuthenticationToken authenticationToken) throws AuthenticationException {
assertRealmsConfigured();
//依据Realm中配置的支持Token来进行过滤
List<Realm> realms www.yongshiyule178.com/ = this.getRealms()
.stream()
.filter(realm -> realm.supports(www.michenggw.com authenticationToken))
.collect(Collectors.toList());
if (realms.size() == 1) {
return doSingleRealmAuthentication(realms.get(0), authenticationToken);
} else {
return doMultiRealmAuthentication(realms, authenticationToken);
}
}
}
认证授权配置:Realm.java
public class SystemRealm extends AuthorizingRealm {
...
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
//重要!!多realm每个都会执行授权相关信息,此处进行过滤
if(principals.fromRealm(getName()).isEmpty()){
return null;
}
//授权代码...
return authorizationInfo;
}
/**
* 主要是用来进行身份认证的
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
throws AuthenticationException {
//生产AuthenticationInfo代码...
//校验的部分由配置的credentialsMatcher进行处理
return authenticationInfo;
}
/**
* 扩展认证token
*
* @param authenticationToken
* @return boolean
* @author mjm
* @date 2018/7/3 12:32
*/
@Override
public boolean supports(AuthenticationToken authenticationToken) {
//设置此Realm支持的Token
return authenticationToken != null && (authenticationToken instanceof UsernamePasswordToken );
}
}
过滤器配置:AuthenticationFilter.java
基础的过滤器类型:官网中默认有很多已实现的过滤器,可依据需求扩展
public class AuthenticationFilter extends FormAuthenticationFilter {
....
/**
* 创建令牌
*
* @param servletRequest ServletRequest
* @param servletResponse ServletResponse
* @return 令牌
*/
@Override
protected AuthenticationToken createToken(ServletRequest servletRequest, ServletResponse servletResponse) {
//依据request中不同的参数创建不同的token...
return new xxxToken(...);
}
....
Spring Boot -Shiro配置多Realm的更多相关文章
- (39.4) Spring Boot Shiro权限管理【从零开始学Spring Boot】
在读此文章之前您还可能需要先了解: (39.1) Spring Boot Shiro权限管理[从零开始学Spring Boot] http://412887952-qq-com.iteye.com/b ...
- (39.3) Spring Boot Shiro权限管理【从零开始学Spring Boot】
在学习此小节之前您可能还需要学习: (39.1) Spring Boot Shiro权限管理[从零开始学Spring Boot] http://412887952-qq-com.iteye.com/b ...
- (39.2). Spring Boot Shiro权限管理【从零开始学Spring Boot】
(本节提供源代码,在最下面可以下载) (4). 集成Shiro 进行用户授权 在看此小节前,您可能需要先看: http://412887952-qq-com.iteye.com/blog/229973 ...
- (39.1) Spring Boot Shiro权限管理【从零开始学Spring Boot】
(本节提供源代码,在最下面可以下载)距上一个章节过了二个星期了,最近时间也是比较紧,一直没有时间可以写博客,今天难得有点时间,就说说Spring Boot如何集成Shiro吧.这个章节会比较复杂,牵涉 ...
- Spring Boot Shiro 权限管理
Spring Boot Shiro 权限管理 标签: springshiro 2016-01-14 23:44 94587人阅读 评论(60) 收藏 举报 .embody{ padding:10px ...
- spring boot shiro redis整合基于角色和权限的安全管理-Java编程
一.概述 本博客主要讲解spring boot整合Apache的shiro框架,实现基于角色的安全访问控制或者基于权限的访问安全控制,其中还使用到分布式缓存redis进行用户认证信息的缓存,减少数据库 ...
- Spring Boot Shiro
Shiro 核心 API Subject:用户主体(每次请求都会创建Subject). principal:代表身份.可以是用户名.邮件.手机号码等等,用来标识一个登录主体的身份. credentia ...
- Spring Boot Shiro 使用教程
Apache Shiro 已经大名鼎鼎,搞 Java 的没有不知道的,这类似于 .Net 中的身份验证 form 认证.跟 .net core 中的认证授权策略基本是一样的.当然都不知道也没有关系,因 ...
- 玩转spring boot——properties配置
前言 在以往的java开发中,程序员最怕大量的配置,是因为配置一多就不好统一管理,经常出现找不到配置的情况.而项目中,从开发测试环境到生产环境,往往需要切换不同的配置,如测试数据库连接换成生产数据库连 ...
随机推荐
- memcpy、memmove、memset、memchr、memcmp、strstr详解
第一部分 综述 memcpy.memmove.memset.memchr.memcmp都是C语言中的库函数,在头文件string.h中.memcpy和memmove的作用是拷贝一定长度的内存的内容,m ...
- odoo权限
ir.model.access.csv文件这里注意,用户和经理的写法 id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create, ...
- [HNOI2012]集合选数 BZOJ2734
分析: 构造法...每次找到一个没有被选过的数,用这个数推出一个表格,之后在表格上跑状压DP,时间复杂度O(n) 附上代码: #include <cstdio> #include < ...
- [FQ]Tor + Chrome + PAC 尝试 FQ
记录一次比较成功的FQ经历 1.从Tor官网下载最新的Tor browser,速度较慢可以从文末给出的链接中下载. 2.安装Tor browser. 3. Tor网络设置 3.1 那个描述与你的情况最 ...
- flaskr 报错及其修改
作者:hhh5460 官网有一个flaskr的例子,按照其8个步骤(包括测试),一步一步照着做,有3个地方报错. 究其原因,可能是flaskr这个例子年代比较久远,而现在python以及flask都有 ...
- [CF1083D]The Fair Nut’s getting crazy[单调栈+线段树]
题意 给定一个长度为 \(n\) 的序列 \(\{a_i\}\).你需要从该序列中选出两个非空的子段,这两个子段满足 两个子段非包含关系. 两个子段存在交. 位于两个子段交中的元素在每个子段中只能出现 ...
- 一道面试题来了解线程notifyAll()和wait()的方法
题目:三个线程,分别打印A.B.C,要求按ABC的顺序循环打印10次. package com.slowcity.crud.controller; public class PrintOneTwoTh ...
- UWP简单示例(一):快速合成音乐MV
说明 本文发布时间较早,内容可能已过时.最新动态请关注 TypeScript 版本.(2019 年 3 月 注) 在线演示: 音频可视化(TypeScript) 准备 IDE:Visual Studi ...
- 【Android UI设计与开发】第04期:引导界面(四)仿人人网V5.9.2最新版引导界面
这一篇我将会以人人网的引导界面为实例来展开详细的讲解,人人网的引导界面比较的新颖,不同于其他应用程序千篇一律的靠滑动来引导用户,而是以一个一个比较生动形象的动画效果展示在用户们的面前,有一种给人眼前一 ...
- linux systemctl 命令
目录 预热 管理单个 unit 查看系统上的 unit 管理不同的操作环境(target unit) 检查 unit 之间的依赖性 相关的目录和文件 systemctl daemon-reload 子 ...