简单实现Shiro单点登录(自定义Token令牌)
1. MVC Controller 映射 sso 方法。
/**
* 单点登录(如已经登录,则直接跳转)
* @param userCode 登录用户编码
* @param token 登录令牌,令牌组成:sso密钥+用户名+日期,进行md5加密,举例:
* String secretKey = Global.getConfig("shiro.sso.secretKey");
* String token = Digests.md5(secretKey + userCode + DateUtils.getDate("yyyyMMdd"));
* @param url 登录成功后跳转的url地址。
* @param relogin 是否重新登录,需要重新登录传递true
* 例如:http://localhost/project/sso/{token}?url=xxx&relogin=true
*/
@RequestMapping(value = "sso/{userCode}/{token}")
public String sso(@PathVariable String userCode, @PathVariable String token,
@RequestParam(required=true) String url, String relogin, Model model) {
Principal principal = SecurityUtils.getSubject().getPrincipal();
// 如果已经登录
if(principal != null){
// 如果设置强制重新登录,则重新登录
if (BooleanUtils.toBoolean(relogin)){
SecurityUtils.getSubject().logout();
}
// 否则,直接跳转到目标页
else{
return "redirect:" + Encodes.urlDecode2(url);
}
}
// 进行单点登录
if (token != null){
UsernamePasswordToken upt = new UsernamePasswordToken();
try {
upt.setUsername(userCode); // 登录用户名
upt.setPassword(token.toCharArray()); // 密码组成:sso密钥+用户名+日期,进行md5加密,举例: Digests.md5(secretKey+username+20150101))
upt.setParams(upt.toString()); // 单点登录识别参数,see: AuthorizingRealm.assertCredentialsMatch
} catch (Exception ex){
if (!ex.getMessage().startsWith("msg:")){
ex = new AuthenticationException("msg:授权令牌错误,请联系管理员。");
}
model.addAttribute("exception", ex);
}
try {
SecurityUtils.getSubject().login(upt);
return "redirect:" + Encodes.urlDecode2(url);
} catch (AuthenticationException ae) {
if (!ae.getMessage().startsWith("msg:")){
ae = new AuthenticationException("msg:授权错误,请检查用户配置,若不能解决,请联系管理员。");
}
model.addAttribute("exception", ae);
}
}
return "error/403";
}
2. 重载org.apache.shiro.realm.AuthorizingRealm类的assertCredentialsMatch方法
/**
* 认证密码匹配调用方法
*/
@Override
protected void assertCredentialsMatch(AuthenticationToken authcToken,
AuthenticationInfo info) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
// 若单点登录,则使用单点登录授权方法。
if (token.toString().equals(token.getParams())){
// sso密钥+用户名+日期,进行md5加密,举例: Digests.md5(secretKey+username+20150101))
String secretKey = Global.getConfig("shiro.sso.secretKey");
String password = Digests.md5(secretKey + token.getUsername() + DateUtils.getDate("yyyyMMdd"));
if (password.equals(String.valueOf(token.getPassword()))){
return;
}
}
super.assertCredentialsMatch(token, info);
}
3. 实现Shiro无状态访问,如通过传递sessionid参数即可实现会话访问
这里需要自定义Shiro的SessionManager类,方法是继承org.apache.shiro.web.session.mgt.DefaultWebSessionManager类,重载getSessionId方法,如下:
public class SessionManager extends DefaultWebSessionManager {
public SessionManager() {
super();
}
@Override
protected Serializable getSessionId(ServletRequest request, ServletResponse response) {
// 如果参数中包含“__sid”参数,则使用此sid会话。 例如:http://localhost/project?__sid=xxx&__cookie=true
// 其实这里还可以使用如下参数:cookie中的session名称:如:JSESSIONID=xxx,路径中的 ;JESSIONID=xxx,但建议还是使用 __sid参数。
String sid = request.getParameter("__sid");
if (StringUtils.isNotBlank(sid)) {
// 是否将sid保存到cookie,浏览器模式下使用此参数。
if (WebUtils.isTrue(request, "__cookie")){
HttpServletRequest rq = (HttpServletRequest)request;
HttpServletResponse rs = (HttpServletResponse)response;
Cookie template = getSessionIdCookie();
Cookie cookie = new SimpleCookie(template);
cookie.setValue(sid); cookie.saveTo(rq, rs);
}
// 设置当前session状态
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE,
ShiroHttpServletRequest.URL_SESSION_ID_SOURCE); // session来源与url
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, sid);
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);
return sid;
}else{
return super.getSessionId(request, response);
}
}
}
简单实现Shiro单点登录(自定义Token令牌)的更多相关文章
- shiro 单点登录原理 实例
原创 2017年02月08日 17:39:55 4006 Shiro 1.2开始提供了Jasig CAS单点登录的支持,单点登录主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即 ...
- 使用 JSONP 实现简单的 SSO 单点登录
SSO 即 Single Sign On(单点登录). 一.二级域名之间的单点登录 不需要用到JSONP 或者 p3p 协议,直接使用 COOKIE 就行了,因为顶级域名相同就能实现 COOKIE ...
- 也谈SSO,一个简单实用的单点登录Demo
关于SSO(单点登录),百度百科解释如下 : “SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要 ...
- cas 单点登录 --自定义审计日记@Audit()
错误信息: org.springframework.webflow.execution.ActionExecutionException: Exception thrown executing [An ...
- 简单实现web单点登录
主要参考文档:http://blog.csdn.net/jimmy609/article/details/18605781 1.工程总体结构: 2.修改C:\Windows\System32\driv ...
- (四)SSO之CAS框架单点登录,自定义验证登录方式
应需求的变化,在登录cas的时候,默认根据用户名和密码进行验证,如果加上用户名,密码和一个系统标识进行验证呢?该如何做呢? 我们知道cas默认的登录界面中,输入的用户名和密码,再配置一下deploye ...
- SSO单点登录PHP简单版
前面做了一个新项目,需要用户资源可以需要共享.由于之前没有做过这样的东西,回家之后,立马网站百度"单点登录".帖子很多,甄别之后,这里列几篇认为比较有营养. http://blog ...
- 初探系列 — Pharbers用于单点登录的权限架构
一. 前言 就职公司 法伯科技是一家以数据科技为驱动, 专注于医药健康领域的循证咨询公司. 以数据科学家身份, 赋能医药行业. 让每位客户都能享受数据带来的价值, 洞察业务, 不止于数据, 让决策更精 ...
- 最准确的单点登录SSO图示和讲解(有代码范例)|手把手教做单点登录(SSO)系列之二
写第一篇博客<手把手教做单点登录(SSO)系列之一:概述与示例>,就获得了园子里朋友们热情的评论和推荐,感谢各位. 我那篇文章同时发了CSDN和博客园.对比一下,更感受到博客园童鞋们的技术 ...
随机推荐
- Linux---vim编辑文本文件
1.vim工作模式 普通模式:该模式下可以快速移动光标位置,能够执行对文本的快捷编辑,但是不能够在文本中输入内容: 插入模式:该模式主要用于在文本中插入内容,是文本输入时最常使用的模式: 命令模式:该 ...
- JS高阶---闭包缺点(内存溢出与泄露)
[大纲] [主体] (1)闭包优缺点 .延长局部变量的生命周期2.外部访问函数内部变量 闭包的优点同时也是它的缺点,就是 (2)解决方案 .能不用闭包就不用(很难做到,因为应用较多) .及时释放--- ...
- LG2512/BZOJ1045 「HAOI2008」糖果传递 中位数
问题描述 LG2512 BZOJ1045 题解 这是一个链状问题的环状版本. 问题最终变为给定数轴上的\(n\)个点,找出一个到他们的距离之和尽量小的点,而这个点就是这些数中的中位数. 网络流24题的 ...
- cf 1182 E - Product Oriented Recurrence
当时脑残了, 不会写矩阵快速幂中更改的系数, 其实把他扔到矩阵里同时递推就好了 #include<cstdio> #include<algorithm> #include< ...
- 【BZOJ3529】[SDOI2014] 数表(莫比乌斯反演)
点此看题面 大致题意: 规定一个\(n*m\)数表中每个数为\(\sum_{d|i,d|j}d\),求数表中不大于\(a\)的数之和. 不考虑限制 我们先不考虑限制,来推一波式子. 首先,易知数表中第 ...
- NLP中一些数学知识
1.所谓概率函数就是要在整个样本空间分配概率值,概率值总和为1 2.一个完备的概率空间应该由样本空间,概率函数和事件域这三部分组成,在统计自然语言处理中,我们的目标就是为建立的模型定义一个符合上述条件 ...
- [LeetCode] 919. Complete Binary Tree Inserter 完全二叉树插入器
A complete binary tree is a binary tree in which every level, except possibly the last, is completel ...
- [LeetCode] 902. Numbers At Most N Given Digit Set 最大为 N 的数字组合
We have a sorted set of digits D, a non-empty subset of {'1','2','3','4','5','6','7','8','9'}. (Not ...
- rIoTboard学习系列
刚在咸鱼买了块开发板,比较老了14年的,SOC为imx6solo,内核3.10,uboot2009的,准备先移植一个较新的uboot 到nxp的git下获取他们维护的uboot,网址http://gi ...
- IOI 2013 袋熊(线段树+分块+决策单调性)
题意 http://www.ioi2013.org/wp-content/uploads/tasks/day1/wombats/Wombats%20zh%20(CHN).pdf 思路 我们设矩形的 ...