经过实践的Shiro配置,利用 sSOInterceptor 进行sso登录拦截

配置

@Configuration
public class ShiroConfiguration extends BaseLogger { @Autowired(required = false)
private SSOInterceptor sSOInterceptor; @Autowired(required = false)
private CacheUtils cacheUtils; //将自己的验证方式加入容器
@Bean
public UserShiroRealm myShiroRealm() {
//自定义realm,授权+登录
UserShiroRealm myShiroRealm = new UserShiroRealm();
//自定义login token类型
myShiroRealm.setAuthenticationTokenClass(XXAuthenticationToken.class);
return myShiroRealm;
} //权限管理,配置主要是Realm的管理认证
@Bean
public DefaultWebSecurityManager securityManager(UserShiroRealm userShiroRealm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(userShiroRealm); //web session管理
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
//企业级缓存sessionDao,获取和保存session,这里session将保存到cacheManager中
sessionManager.setSessionDAO(new EnterpriseCacheSessionDAO());
//安全管理器设置session控制器
securityManager.setSessionManager(sessionManager); //设置cacheManager,鉴权和session使用同一个cache,因为session为uuid,用户为用户名,不会冲突
securityManager.setCacheManager(new CacheManager() {
@Override
public <K, V> Cache<K, V> getCache(String name) throws CacheException {
logger.info("get cache:{}", name);
return new JimdbCache<>(cacheUtils, CacheConstants.shiroCacheKey(""));
}
}); return securityManager;
} //Filter工厂,设置对应的过滤条件和跳转条件
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(org.apache.shiro.web.mgt.DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager); //url拦截权限定义
Map<String, String> map = new HashMap<>();
//登出自己控制
//map.put("/logout","logout");自己控制登出
//对所有用户认证
map.put("/**", "authc");
//静态资源部校验
map.put("/static/**", "anon");
map.put("/checkAppOn.html", "anon");
shiroFilterFactoryBean.setFilterChainDefinitionMap(map); //登录地址,首页地址触发sso登录
shiroFilterFactoryBean.setLoginUrl("/");
//首页
shiroFilterFactoryBean.setSuccessUrl("/index");
//错误页面,认证不通过时跳转
shiroFilterFactoryBean.setUnauthorizedUrl("/error"); //自定义登录过滤器,校验登录,不能直接将filter放入Spring中,他会和ShiroFilter同级,造成混乱
shiroFilterFactoryBean.getFilters().put("authc", new XXAuthenticationFilter(sSOInterceptor)); return shiroFilterFactoryBean;
} //加入注解的使用,不加入这个注解不生效
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(org.apache.shiro.web.mgt.DefaultWebSecurityManager securityManager) {
//注解支持,可支持类级、method级权限控制
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
} }

登录校验Filter

public class XXAuthenticationFilter extends AdviceFilter {

    private final static Logger LOGGER = LoggerFactory.getLogger(ErpAuthenticationFilter.class);

    private SSOInterceptor sSOInterceptor;

    public ErpAuthenticationFilter(SSOInterceptor sSOInterceptor) {
this.sSOInterceptor = sSOInterceptor;
} /**
* 处理sso登录信息,且可登录,返回true
*
* @param srequest
* @param sresponse
* @return
* @throws Exception
*/
protected boolean preHandle(ServletRequest srequest, ServletResponse sresponse) throws Exception { HttpServletRequest request = (HttpServletRequest) srequest;
HttpServletResponse response = (HttpServletResponse) sresponse;
try { //sSOInterceptor来控制跳转登录sso页
if (sSOInterceptor.preHandle(request, response, null)) {
LoginContext loginContext = ActionContext.getLoginContext();
Subject subject = SecurityUtils.getSubject();
//没有登录时,自动登录系统
if(!subject.isAuthenticated()) {
subject.login(new ErpAuthenticationToken(loginContext.getAccount(), loginContext));
}
return true;
}
} catch (Exception e) {
LOGGER.error("预处理登录信息失败", e);
} //中止处理链条
return false;
}
}

登出

@RequestMapping(value = {"/logout", "/login"})
public void logout(HttpServletRequest request, HttpServletResponse response) throws IOException {
LoginContext loginContext = ActionContext.getLoginContext();
//删除业务key
cookieUtils.deleteCookie(response, Profiles.getCookieKey());
logger.info("用户:{} 退出", loginContext.getAccount()); //清缓存
cacheUtils.deleteObject(CacheConstants.manUserShiroCacheKey(loginContext.getAccount()));
cacheUtils.deleteObject(CacheConstants.manUserMenuCacheKey(loginContext.getAccount()));
//shiro登出
Subject subject = SecurityUtils.getSubject();
subject.logout();
//清除cookie
removeCookie(response); ErpDotnetInterceptor.toErpLogin(request, response);
} private void removeCookie(HttpServletResponse response) {
Cookie cookie = new Cookie(Profiles.getCookieKey(),"");
cookie.setMaxAge(0);
response.addCookie(cookie);
}

Spring Shiro配置第三方SSO客户端登录的更多相关文章

  1. spring + shiro + cas 实现sso单点登录

    sso-shiro-cas spring下使用shiro+cas配置单点登录,多个系统之间的访问,每次只需要登录一次,项目源码 系统模块说明 cas: 单点登录模块,这里直接拿的是cas的项目改了点样 ...

  2. (十一) 整合spring cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)

    上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...

  3. Spring Cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)

    上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...

  4. Spring+shiro配置JSP权限标签+角色标签+缓存

    Spring+shiro,让shiro管理所有权限,特别是实现jsp页面中的权限点标签,每次打开页面需要读取数据库看权限,这样的方式对数据库压力太大,使用缓存就能极大减少数据库访问量. 下面记录下sh ...

  5. Spring Cloud云架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)

    上一篇我根据框架中OAuth2.0的使用总结,画了SSO单点登录之OAuth2.0 登出流程,今天我们看一下根据用户token获取yoghurt信息的流程: /** * 根据token获取用户信息 * ...

  6. 整合spring cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)

    之前写了很多关于spring cloud的文章,今天我们对OAuth2.0的整合方式做一下笔记,首先我从网上找了一些关于OAuth2.0的一些基础知识点,帮助大家回顾一下知识点: 一.oauth中的角 ...

  7. Spring Cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)

    今天我们对OAuth2.0的整合方式做一下笔记,首先我从网上找了一些关于OAuth2.0的一些基础知识点,帮助大家回顾一下知识点: 一.oauth中的角色 client:调用资源服务器API的应用 O ...

  8. Spring Cloud云架构 - SSO单点登录之OAuth2.0 登出流程(3)

    上一篇我根据框架中OAuth2.0的使用总结,画了一个根据用户名+密码实现OAuth2.0的登录认证的流程图,今天我们看一下logout的流程: /** * 用户注销 * @param accessT ...

  9. Spring Security基于Oauth2的SSO单点登录怎样做?一个注解搞定

    一.说明 单点登录顾名思义就是在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统,免除多次登录的烦恼.本文主要介绍 同域 和 跨域 两种不同场景单点登录的实现原理,并使用 Spring ...

随机推荐

  1. 2018尚硅谷最新SpringCloud免费视频教程

    [课程内容] 01.前提概述 02.大纲概览 03.从面试题开始 04.微服务是什么 05.微服务是什么2 06.微服务与微服务架构 07.微服务优缺点 08.微服务技术栈有哪些 09.为什么选择Sp ...

  2. 1.UiPath账密安全保存常见方法

    今天在写流程的时候突然用到密码保存,看到同事不同项目中所用到的方法不同,就看了一下别的同学博客,总结的特别好,自己跟着实操了一遍,受益匪浅. RPA适合于登录不同的系统代替人工操作,而登录系统时难免要 ...

  3. 转载:关于Python3中venv虚拟环境

    https://www.cnblogs.com/zhaof/p/7299025.html

  4. Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件

    本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...

  5. 每日爬虫JS小逆之5分钟旅游网MD5一锅端

    来吧骚年,每天花5分钟锻炼一下自己的JS调试也是极好的,对后期调试滑块验证码还原.拖动很有帮助,坚持下去,我们能赢.建议亲自试试哦,如果对大家有帮助的话不妨关注一下知识图谱与大数据公众号,当然不关注也 ...

  6. Linux等待队列(Wait Queue)

    1. Linux等待队列概述 Linux内核的等待队列(Wait Queue)是重要的数据结构,与进程调度机制紧密相关联,可以用来同步对系统资源的访问.异步事件通知.跨进程通信等.在Linux中,等待 ...

  7. 基础篇:详解JAVA对象实例化过程

    目录 1 对象的实例化过程 2 类的加载过程 3 触发类加载的条件 4 对象的实例化过程 5 类加载器和双亲委派规则,如何打破双亲委派规则 欢迎指正文中错误 关注公众号,一起交流 参考文章 1 对象的 ...

  8. centos 启动 elasticsearch 失败集

    环境: elasticsearch 6.5.2, java 连接失败 启动后当你 使用 curl http://localhost:9200 测试时,得到如下结果 Curl: (7) Failed c ...

  9. idea查询类的继承关系图

    方式一:在一个类中,鼠标右键: 结果如下图所示: 方式2:在一个类中 结果如图:

  10. 为啥你用@JsonFormat注解时,LocalDateTime会反序列化失败?

    写在前面 最近,有个小伙伴问我:我在SpringBoot项目中,使用@JsonFormat注解标注LocalDateTime类型的字段时,LocalDateTime反序列化失败,这个我该怎么处理呢?别 ...