采用json web token的形式解决前后端缓存问题及缓存一致性问题。具体可以看我之前写的:JSON WEB TOKEN解决跨域、缓存一致性问题 ​ 首先简单介绍下shiro的关键概念 Subject:用户主体(把操作交给SecurityManager) SecurityManager:安全管理器(关联Realm) Realm: Shiro连接数据的桥梁 配置pom文件:

<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.4.0</version>
</dependency>

弄一个包专门写个shiro的配置类,这里新建一个com.hykj.fiserver.env.shiro:

@Configuration
public class Config {/*** 常用的过滤器:*  anon:无需认证就能访问 *  authc:必须认证了才能访问 user:必须拥有记住我功能才能访问 *  perms:拥有对每个资源的权限才能访问*  role:拥有某个角色权限才能访问* @return*/@Beanpublic ShiroFilterFactoryBean getShiroFilterFactoryBean() {ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();bean.setSecurityManager(securityManager());LinkedHashMap<String, String> filterMap = new LinkedHashMap<>();// 添加一个拦截器filterMap.put("/loginAction/login", "anon");//登录的话无需认证就能访问filterMap.put("/**", "authc");//拦截所有请求,有认证才能登录//这里没有启用授权过滤器,就是写个例子//filterMap.put("/user/add", "perms[user:add]");bean.setFilterChainDefinitionMap(filterMap);// 设置登录请求,这里是被拦截后回转的页面bean.setLoginUrl("/loginAction/loginError");// 设置未授权页面,这里是未授权跳转的页面,没有启动bean.setUnauthorizedUrl("/loginAction/noauth");return bean;}/*** 安全管理器* @return*/@Beanpublic DefaultWebSecurityManager securityManager() {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setSessionManager(sessionManager());securityManager.setRealm(userRealm());return securityManager;}@Beanpublic SessionManager sessionManager() {TokenSessionManager tokenSessionManager = new TokenSessionManager();return tokenSessionManager; }@Beanpublic UserRealm userRealm() {return new UserRealm();}
}接下来写UserRealm
public class UserRealm extends AuthorizingRealm {private final static Log _logger = LogFactory.getLog(UserRealm.class);@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {//这里是权限认证的地方,我项目中没有使用shiro的权限认证System.out.println("执行授权");SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();// info.addStringPermission("user:add");// 拿到当前登录的用户Subject subject = SecurityUtils.getSubject();UserCache currentUser = (UserCache) subject.getPrincipal();info.addStringPermission(currentUser.getOpId());return info;}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {//subject.login(token);一定会到这里来,这里就是验证登录的地方UserCache user = new UserCache();user.setOpId("test");user.setUserPassword("1234");user.setUserName("test");UsernamePasswordToken userToken = (UsernamePasswordToken) token;//这里要判断用户名和密码了,通常是去数据库核对用户名和密码了if(!new String(userToken.getUsername()).equals(user.getUserName())) {//用户名错误throw new UnknownAccountException();}if (!new String(userToken.getPassword()).equals(user.getUserPassword())) {//密码错误throw new IncorrectCredentialsException(); }return new SimpleAuthenticationInfo(user, user.getUserPassword(), "");}}

token就是配置在这里了,要求前端在头中加入token

public class TokenSessionManager extends DefaultWebSessionManager {private static final String TOKEN = "token";private static final String REFERENCED_SESSION_ID_SOURCE = "Stateless request";private final static Log _logger = LogFactory.getLog(TokenSessionManager.class);public TokenSessionManager() {super();}@Overridepublic Serializable getSessionId(ServletRequest request, ServletResponse response) {// String token = WebUtils.toHttp(request).getHeader(TOKEN);// 前端请求头必须传入token的值,把他的值当做是sessionIdif (!StringUtils.isEmpty(token)) {request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, REFERENCED_SESSION_ID_SOURCE);request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, token);request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);_logger.info("token=" + token);return token;} else {_logger.info("token为空");return null;// 否则按默认规则从cookie取sessionId//return super.getSessionId(request, response);}}
}

接下来进行测试,注意以下几点: 1.UserRealm做的user 其id为test,密码为1234,要都匹配才能过 2.登录失败是返回/loginAction/loginError,该接口返回一个字符串,如下代码:

@RequestMapping(value = "/loginError", produces = "application/json; charset=utf-8")@ResponseBodypublic String loginError(@RequestHeader("token") String token) {return "hello world loginError; token = " + token;}

3./loginAction/login接口是不会被拦截的,其他请求会被拦截 测试工具:apipost 测试地址1:http://localhost:13001/FIServer/loginAction/userTest

@RequestMapping(value = "/userTest", produces = "application/json; charset=utf-8")@ResponseBodypublic String userTest() {return "hello world Test";}

因为不是loginAction/login所以被拦截了,虽然有token但还是被转发到loginError 测试地址2:http://localhost:13001/FIServer/loginAction/login?username=testname&password=12345

@RequestMapping(value = "/login", produces = "application/json; charset=utf-8")@ResponseBodypublic String login(String username, String password, HttpServletRequest request) {// 获取当前的用户Subject subject = SecurityUtils.getSubject();// 封装用户的登录数据UsernamePasswordToken userToken = new UsernamePasswordToken(username, password);try {subject.login(userToken);UserCache user = (UserCache) subject.getPrincipal();System.out.println(user.getOpId());String token = _jwtTokenUtil.createToken(getJSON(user));return "登录成功token=" + token;} catch (UnknownAccountException e) {return "用户名错误";} catch (IncorrectCredentialsException e) {return "密码错误";}}

很明显因为密码不是1234所以一定会返回用户名错误

测试地址3:http://localhost:13001/FIServer/loginAction/login?username=test&password=1234

这次就没有问题啦,注意登录的时候是没有token的,并且还会生产token返回给前端,就是图中看不懂的那一堆字符

shiro session 设置取不到_SpringCloud+shiro+前后端分离相关推荐

  1. 基于shiro+jwt的真正rest url权限管理,前后端分离

    代码地址如下: http://www.demodashi.com/demo/13277.html bootshiro & usthe bootshiro是基于springboot+shiro+ ...

  2. springboot+jwt+shiro+vue+elementUI+axios+redis+mysql完成一个前后端分离的博客项目(笔记,帮填坑)

    根据B站up主MarkerHub视频制作的一个笔记 我的博客 B站博主链接: https://www.bilibili.com/video/BV1PQ4y1P7hZ?p=1 博主的开发文档: http ...

  3. 单realm模式下前后端分离实现springboot+shiro+jwt+vue整合

    shiro+jwt实现前后端分离 一.RBAC概念 基于角色的权限访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注.在R ...

  4. Session(数据)共享的前后端分离Shiro实战

    1,前言 本文期望描述如何使用Shiro构建基本的安全登录和权限验证.本文实战场景有如下特殊需求:1,在集群和分布式环境实现session共享:2,前端只使用HTML/CSS/JS.因此无法直接使用S ...

  5. Spring Boot + Vue + Shiro 实现前后端分离、权限控制

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://sina.lt/gauR 本文总结自实习中对项 ...

  6. springboot接收json参数_Springboot + Vue + shiro 实现前后端分离、权限控制

    小Hub领读: 嘿嘿,之前我也发了一篇类似的项目,SpringBoot+Vue的项目,还有视频讲解,如果这篇文章看完不懂,不妨去看看我的视频讲解哈,超级详细! 太赞了,SpringBoot+Vue前后 ...

  7. SpringBoot集成Shiro前后端分离使用redis做缓存

    文章目录 一 .shiro介绍 1.基础介绍 2.基本功能点 3.基本流程图 二. 常用的权限管理表关系 2.1. 表组成 2.2. 表结构 三.实战案例 3.1. 案例介绍 3.2. 依赖 3.3. ...

  8. springboot+shiro前后端分离过程中跨域问题、sessionId问题、302鉴权失败问题

    写在前面:2020年2月29号修改该文章,之前针对302鉴权失败问题的解决方案存在 "WebUtils.toHttp 往返回response写返回值的时候出现回写跨域问题".现已进 ...

  9. CAS单点登出,调整CAS源码,实现前后端分离单点登出、清除redis、shiro登录状态

    前端点击"登出"按钮,跳转到CAS的登出. CAS默认配置了单点登出,在登出后,会向所有客户端系统发送这个用户登出的报文. 各客户端系统有责任接收并处理这个用户登出的报文,然后在注 ...

最新文章

  1. 使用await和async关键字开发nodejs应用批量取出简书网站的文章标题和超链接
  2. fitbit手表中文说明书_如何获取和分析Fitbit睡眠分数
  3. 前端学习(3073):vue+element今日头条管理-删除文章失败(配合axios使用)
  4. Mac 下使用 homebrew 切换不同版本 php
  5. 思科设备debug命令的使用
  6. linux read命令详解
  7. 修改字段名和字段备注
  8. JavaScript中的逗号运算符
  9. 2022年四方系统/四方支付系统部署实战,以及细节讨论,Gitee版本
  10. Java基础语法练习题
  11. linux卸载分区命令,CentOS删除磁盘分区命令
  12. 网站分析-网站流量分析
  13. 3 Idiots ——谢 阿米尔·汗
  14. 基于java+ssm+mysql的医院管理系统
  15. html5页面拨打电话,5.添加页面/设置点击拨打电话
  16. 阴阳师双拉条怎么不被超车
  17. google android模拟器多系统,Android模拟器安装教程_体验google_Android系统手机
  18. 小程序开发入门常见小问题-(1)
  19. 外媒:越南称中国钻井平台向东南偏东方向转移(1)
  20. C# string 字符串去重

热门文章

  1. Python内置函数min(iterable, *[, key, default])
  2. ASP.Net中关于WebAPI与Ajax进行跨域数据交互时Cookies数据的传递
  3. Kafka 客户端实现逻辑分析
  4. 普通视图和物化视图区别
  5. Oracle Caused by: java.sql.SQLException: sql injection violation, syntax error: syntax error, expect
  6. com.alibaba.fastjson.JSONObject之对象与JSON转换方法
  7. MySQL 全文索引实现简单版搜索引擎
  8. Centos 安装python 3.7 遇到 ModuleNotFoundError: No module named _ctypesmake [install] Error 1(亲测下面的红字内容)
  9. Apache与Nginx比较(Nginx 高并发情况常用,必须学习)
  10. Git的fatal: Not a git repository (or any parent up to mount point /home)