核心类简介
  
  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的更多相关文章

  1. (39.4) Spring Boot Shiro权限管理【从零开始学Spring Boot】

    在读此文章之前您还可能需要先了解: (39.1) Spring Boot Shiro权限管理[从零开始学Spring Boot] http://412887952-qq-com.iteye.com/b ...

  2. (39.3) Spring Boot Shiro权限管理【从零开始学Spring Boot】

    在学习此小节之前您可能还需要学习: (39.1) Spring Boot Shiro权限管理[从零开始学Spring Boot] http://412887952-qq-com.iteye.com/b ...

  3. (39.2). Spring Boot Shiro权限管理【从零开始学Spring Boot】

    (本节提供源代码,在最下面可以下载) (4). 集成Shiro 进行用户授权 在看此小节前,您可能需要先看: http://412887952-qq-com.iteye.com/blog/229973 ...

  4. (39.1) Spring Boot Shiro权限管理【从零开始学Spring Boot】

    (本节提供源代码,在最下面可以下载)距上一个章节过了二个星期了,最近时间也是比较紧,一直没有时间可以写博客,今天难得有点时间,就说说Spring Boot如何集成Shiro吧.这个章节会比较复杂,牵涉 ...

  5. Spring Boot Shiro 权限管理

    Spring Boot Shiro 权限管理 标签: springshiro 2016-01-14 23:44 94587人阅读 评论(60) 收藏 举报 .embody{ padding:10px ...

  6. spring boot shiro redis整合基于角色和权限的安全管理-Java编程

    一.概述 本博客主要讲解spring boot整合Apache的shiro框架,实现基于角色的安全访问控制或者基于权限的访问安全控制,其中还使用到分布式缓存redis进行用户认证信息的缓存,减少数据库 ...

  7. Spring Boot Shiro

    Shiro 核心 API Subject:用户主体(每次请求都会创建Subject). principal:代表身份.可以是用户名.邮件.手机号码等等,用来标识一个登录主体的身份. credentia ...

  8. Spring Boot Shiro 使用教程

    Apache Shiro 已经大名鼎鼎,搞 Java 的没有不知道的,这类似于 .Net 中的身份验证 form 认证.跟 .net core 中的认证授权策略基本是一样的.当然都不知道也没有关系,因 ...

  9. 玩转spring boot——properties配置

    前言 在以往的java开发中,程序员最怕大量的配置,是因为配置一多就不好统一管理,经常出现找不到配置的情况.而项目中,从开发测试环境到生产环境,往往需要切换不同的配置,如测试数据库连接换成生产数据库连 ...

随机推荐

  1. Spring 整合Mybatis实例

    演示样例下载地址:http://download.csdn.net/detail/geloin/4506640 本文基于Spring 注解,让Spring跑起来.本文使用Mysql数据库. (1) 导 ...

  2. cocos2d-x 2.2.3 建工程

    2.2以后不再使用模板安装了. 打开终端,进入cocos2d-x目录下的tools/project-creator,执行命令 ./create_project.py -project [项目名] -p ...

  3. 20155233 《网络对抗》Exp4 恶意代码分析

    使用schtasks指令监控系统运行 先在C盘目录下建立一个netstatlog.bat文件,用来将记录的联网结果格式化输出到netstatlog.txt文件中,netstatlog.bat内容为: ...

  4. PostgreSQL基础知识与基本操作索引页

    磨砺技术珠矶,践行数据之道,追求卓越价值 返回顶级页:PostgreSQL索引页 luckyjackgao@gmail.com 本页记录所有本人所写的PostgreSQL的基础知识和基本操作相关文摘和 ...

  5. mfc 进程的优先级

    知识点:  进程优先级  获取当前进程句柄  优先级设置  优先级变动  优先级获取 一.进程优先级(优先级等级) 简单的说就是进程(线程)的优先级越高,那么就可以分占相对多的CPU时间片. ...

  6. ES6 之reduce的高级技巧

    reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值.reduce() 方法接受四个参数:初始值(或者上一次回调函数的返回值),当前元素值,当前索引,调用 ...

  7. python语言程序设计2

    1, 代码高亮色彩体系 2, 缩进,一行代码开始前的空白区域,表达程序的格式框架 单层缩进,多层缩进 特点 概念,缩进是语法的一部分,缩进不正确的话可能会导致程序运行错误 用处(意义),是表达代码间包 ...

  8. post请求参数Json字符串包含数组的校验和处理

    传入参数类型 {"aaa":"aaaa","bbb":"bbb","ccc":"ccc&q ...

  9. 金蝶盘点机PDA仓库条码管理:仓库如何盘点

    1.1. 仓库盘点 传统的仓库盘点,需要人工手工抄写盘点单,时候再去电脑上一行行的录入盘点单,操作非常耗时费力,往往需要盘点好几天,最终盘点效果还不好,在抄写过程中容易出现错误,从而造成盘点结果不准确 ...

  10. babel的使用(关于使用async报错的问题)

    一.配置文件.babelrc .babelrc 文件存放在项目的根目录下. { "presets": [], "plugins": [] } presets 字 ...