Shiro 笔记
功能
认证
授权
加密
session 管理
认证
Subject 是一个与系统交互的实体,可以是人,也可以是其他等
调用 SecurityUtils.getSubject()返回当前Subject,即当前用户
// 创建 Realm
IniRealm iniRealm = new IniRealm("classpath:shiro.ini");
// 将 Realm 给 SecurityManager
SecurityManager securityManager = new DefaultSecurityManager(iniRealm);
// 将 SecurityManager 赋值给 SecurityUtils
SecurityUtils.setSecurityManager(securityManager);
// 获取当前 Subject (当前用户)
Subject currentUser = SecurityUtils.getSubject();
// 判断是否认证
if (! currentUser.isAuthenticated()) {
// 要进行登录的 Token
UsernamePasswordToken token = new UsernamePasswordToken("name", "password");
token.setRememberMe(true);
try {
// 登录-使用 Realm 校验要登录的 Token
currentUser.login(token);
} catch (UnknownAccountException uae) {
log.error("Username Not Found!", uae);
} catch (IncorrectCredentialsException ice) {
log.error("Invalid Credentials!", ice);
} catch (LockedAccountException lae) {
log.error("Your Account is Locked!", lae);
} catch (AuthenticationException ae) {
log.error("Unexpected Error!", ae);
}
}
Realm 配置文件
[users]
user = password, admin
user2 = password2, editor
[roles]
admin = *
editor = articles:*
授权
对用户赋予指定的角色,每个角色有特定的权限
// 判断用户是否有特定角色
if (currentUser.hasRole("admin")) {
log.info("Welcome Admin");
} else if (currentUser.hasRole("editor")) {
log.info("Welcomt Editor");
} else {
log.info("Welcome Guest");
}
// 判断当前用户是否有特定权限
if (currentUser.isPermitted("articles:compose")) {
log.info("You can compose an article");
} else {
log.info("You are not permitted to compose an article!");
}
Realm 配置
Realm 是一个 DAO,用来保存用户认证和授权所需要的信息,它可以来自文件也可以来自数据库等
要创建一个 Realm,只需要实现 Realm 接口,框架中有已经实现的 JdbcRealm,可以继承它,覆写下面的方法
doGetAuthenticationInfo()、doGetAuthorizationInfo()、getRoleNamesForUser()与getPermissions()
之后可以与之前IniRealm同样使用
登出
currentUser.logout();
Session 管理
如果在 Web 环境下,默认使用HttpSession实现,在独立桌面应用中也可使用
Session session = currentUser.getSession();
session.setAttribute("key", "value");
String value = (String) session.getAttribute("key");
if (val.equals("value")) {
log.info("Retrieved the correct value! [" + vallue + "]");
}
集成到 SpringBoot
maven 依赖:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-web-starter</artifactId>
<version>1.4.0</version>
</dependency>
下面需要配置 Realm 与 Shiro security filters
@Bean
public Realm realm() {
return new MyCustomRealm();
} @Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition filter
= new DefaultShiroFilterChainDefinition(); filter.addPathDefinition("/secure", "authc");
filter.addPathDefinition("/**", "anon"); return filter;
}
Shiro 笔记的更多相关文章
- Shiro笔记(五)JSP标签
Shiro笔记(五)JSP标签 导入标签库 <%@taglib prefix="shiro" uri="http://shiro.apache.org/tags&q ...
- Shiro笔记(四)编码/加密
Shiro笔记(四)编码/加密 一.编码和解码 //base64编码.解码 @Test public void testBase64(){ String str="tang"; b ...
- Shiro笔记(三)授权
Shiro笔记(三)授权 一.授权方式 1.编程式: Subject subject=SecurityUtils.getSubject(); if(subject.hasRole("root ...
- Shiro笔记(二)身份验证
Shiro笔记(二)身份验证 一.核心代码 @Test public void helloWorldTest(){ IniSecurityManagerFactory factory = new In ...
- Shiro笔记(一)基本概念
Shiro笔记(一)基本概念 一.简介 Shiro是一个Java安全框架,可以帮助我们完成:认证.授权.加密.会话管理.与Web集成.缓存等. Authentication:身份认证/登录,验证用户是 ...
- Apache shiro 笔记整理之web整合一
下面内容是在看了涛哥的<跟我一起学shiro> 和 视频<一头扎入进shiro> 后整理出来备忘和方便自己和其它人学习. 个人主页:http://www.itit123.cn/ ...
- Shiro笔记--shiroFilter权限过滤
1.shiro中shiroFilter中的一些配置页面的过滤权限 <!--名字必须和web.xml里面的filter-name一样--> <bean id="shiroFi ...
- Shiro笔记(六)Shiro标签的使用
Shiro标签的使用 引入标签库 <%@taglib prefix="shiro" uri="http://shiro.apache.org/tags"% ...
- Shiro笔记(五)Shiro授权
Shiro授权 也叫访问控制,即在应用中控制谁能访问那些资源(如访问页面.编辑数据.页面操作等).在授权中需要了解几个关键对象:主体(subject).资源(resource).权限(Permissi ...
- Shiro笔记(四)Shiro的realm认证
认证流程: 1.获取当前Subject.调用SecurityUtils.getSubject(); 2.测试当前用户是否已经被认证,即是否已经登录,调用Subject的isAurhenticated( ...
随机推荐
- 【colab pytorch】使用tensorboardcolab可视化
import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from ...
- openwrt sdk 添加软件包 Makefile 写法
参考 https://openwrt.org/start?id=docs/guide-developer/packages ,英文稍好点的自己看吧,我写出来也就是方便,英文不好的人看. 软件包的来源, ...
- update join和delete join
UPDATE ASET A.A2 = B.B2FROM BINNER JOIN AON A.A1 = B.B1WHERE B.B2 = "XXX" 上面的语句在SQL SERVER ...
- Ubuntu部署Asp.net core网站无法访问
前几天应工作需要,在阿里云上部署一个测试站点.本以为分分钟的事情,没想到打脸了. 当时直接新建一个webapi项目,publish后直接上传到阿里云,随后设置nginx转发网站端口5000. 接着打开 ...
- python的基本数据类型简介
python的基本数据类型有:数字-numbers.字符串-str.列表-list.元组-tuple.字典-dict.布尔-bool.集合-set 下面来个概览先大概了解一下,后面博文中咱再细说- 1 ...
- Expression表达式目录树
一.初识Expression 1.在上一篇我们讲到了委托(忘记了可以在看看,点赞在看养成习惯),今天要讲的Expression也和委托有一点点关系吧(没有直接关系,只是想要大家看看我其他的文章),Ex ...
- 将xml处理为json对象数组
function xmlStr2js(xmlStr) { var tagNames = xmlStr.match(/<\w+>/g) tagNames = deWeightTagNames ...
- 「CSS」常见的清除浮动方法
下面介绍几种清除浮动的方案,供大家参考: 使用额外的标签clear:both .parent {padding: 10px;width: 200px;background: red;} .child ...
- [POI2017]bzoj4726 Sadota?
题目描述 离线题库请 题目描述 某个公司有\(n\)个人, 上下级关系构成了一个有根树.其中有个人是叛徒(这个人不知道是谁).对于一个人, 如果他 下属(直接或者间接, 不包括他自己)中叛徒占的比例超 ...
- Leetcode_877. 石子游戏(区间dp)
偶数堆石子,只能从首尾取,取多的赢. 每次操作会产生两个子状态,区间dp,记得先枚举长度. code class Solution { public: int dp[505][505]; bool s ...