Shiro简单入门+个人理解(2)
今天开始了Shiro认证及授权的部分,认证及授权是Shiro的主要功能,虽然Shiro还具有加密等功能,但在实际开发时,很少会使用到,在公司一般都有自己的一套加密方式,具体我就不说话了,毕竟有保密协议
废话不多说开始吧
首先开始Shiro认证流程
身份认证:判定用户是否是系统的合法用户。
用户访问系统资源时的认证(对用户身份信息的认证)流程如下:

具体流程分析如下:
1)系统调用subject的login方法将用户信息提交给SecurityManager
2)SecurityManager将认证操作委托给认证器对象Authenticator
3)Authenticator将身份信息传递给Realm。
4)Realm访问数据库获取用户信息然后对信息进行封装并返回。
5)Authenticator 对realm返回的信息进行身份认证。
Controller类的实现
@RequestMapping("doLogin")
@ResponseBody
public JsonResult doLogin(String username,String password){
//1.获取Subject对象
Subject subject=SecurityUtils.getSubject();
//2.通过Subject提交用户信息,交给shiro框架进行认证操作
//2.1对用户进行封装
UsernamePasswordToken token=
new UsernamePasswordToken(
username,//身份信息
password);//凭证信息
//2.2对用户信息进行身份认证
subject.login(token);
//分析:
//1)token会传给shiro的SecurityManager
//2)SecurityManager将token传递给认证管理器
//3)认证管理器会将token传递给realm
return new JsonResult("login ok");
}
}
自定义Realm(ShiroUserRealm)
/**
* 通过此对象获取用户身份相关信息,用户权限相关信息
* 间接的实现了Realm接口
*/
@Service
public class ShiroUserRealm extends AuthorizingRealm {//AuthenticatingRealm (提供了认证数据的获取方法)
//我在此处删除了相关的dao接口,它们只要应用于获取id
//同时在这里我未用到md5加密所以取消了加密方式
/**
* 设置凭证匹配器
* @param credentialsMatcher
*/
@Override
public void setCredentialsMatcher(
CredentialsMatcher credentialsMatcher) {
HashedCredentialsMatcher cMatcher=
new HashedCredentialsMatcher();
cMatcher.setHashAlgorithmName("MD5");
super.setCredentialsMatcher(cMatcher);
}
//自定义缓存map(缓存用户权限信息)
private Map<String,SimpleAuthorizationInfo> authorMap=
new ConcurrentHashMap<String,SimpleAuthorizationInfo>();
/**此方法提供认证数据的获取操作*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token)
throws AuthenticationException {
System.out.println("==获取用户认证信息==");
//1.获取用户名(从令牌对象获取)
UsernamePasswordToken upToken=
(UsernamePasswordToken)token;
String username=upToken.getUsername();
// String username=(String)token.getPrincipal();
// System.out.println("username="+username);
//2.基于用户名执行查询操作获取用户对象
User user=sysUserDao.findUserByUserName(username);
//3.对用户对象进行判定
//3.1判定用户是否存在
if(user==null)
throw new UnknownAccountException();
//4.对用户相关信息进行封装(密码)
SimpleAuthenticationInfo info=new SimpleAuthenticationInfo(
user,//principal (用户新身份)
//因为取消加密方式所以省去了
credentialsSalt, //credentialsSalt(盐)
user.getUSER_PWD(),//hashedCredentials(已加密的凭证)
getName());//realmName real name
//5.返回封装好的数据(返回给认证管理器)
return info;//交给认证管理器
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principals) {
return null;
}
}
此外自定义realm就已经结束
以下就是拦截
在shiro.xml里随心所欲的设置过滤规则
<!-- 定义过滤规则(哪些资源允许匿名访问,哪些资源必须授权访问)-->
<property name="FilterChainDefinitionMap">
<map>
<!-- 说明:anon表示允许匿名访问, authc表示授权访问-->
<entry key="/css/**" value="anon"/>
<entry key="/db_sql/**" value="anon"/>
<entry key="/images/**" value="anon"/>
<entry key="/js/**" value="anon"/>
<entry key="/META-INF/**" value="anon"/>
<entry key="/yzm/**" value="anon"/>
<entry key="/login/getLogins.do" value="anon"/>
<entry key="/doLogout.do" value="logout"/>
<entry key="/**" value="authc"/>
</map>
</property>
</bean>
正常使用就会产生如果你在浏览器进行url填写为授权访问路径,则会跳转你所规定的配置页面,配置页面详情看前一篇文章的spring-shiro.xml
Shiro简单入门+个人理解(2)的更多相关文章
- 权限框架 - shiro 简单入门实例
前面的帖子简单的介绍了基本的权限控制,可以说任何一个后台管理系统都是需要权限的 今天开始咱们来讲讲Shiro 首先引入基本的jar包 <!-- shiro --> <dependen ...
- shiro简单入门介绍
shiro是apache的一个java安全框架 可以完成认证,授权,加密,会话管理,基于web继承,缓存等 功能简介: 从外部来看: shiro架构 Subject:主体,代表了当前“用户”,这个用 ...
- C#委托的最简单入门和理解
委托是.net语言中非常重要的一个概念,初学不太好理解也没有关系的,在一次一次的攻关后会领会到委托的精妙,可以说 .net 没有委托就没有后面更高级的事件,异步多线程等等特性的形成可能.所以一定要 ...
- shiro的简单入门使用
这里只是测试登录认证,没有web模块,没有连接数据库,用户密码放在shiro.ini配置中,密码没有加密处理,简单入门. 基于maven 先看目录结构 测试结果 pom.xml <?xml ve ...
- Shiro简单配置
注:这里只介绍Spring配置模式. 因为官方例子虽然中有更加简洁的ini配置形式,但是使用ini配置无法与spring整合.而且两种配置方法一样,只是格式不一样. 涉及的jar包 核心包shiro- ...
- emacs最简单入门,只要10分钟
macs最简单入门,只要10分钟 windwiny @2013 无聊的时候又看到鼓吹emacs的文章,以前也有几次想尝试,结果都是玩不到10分钟就退出删除了. 这次硬着头皮,打开几篇文章都看完 ...
- [转] shiro简单配置
shiro(1) 注:这里只介绍spring配置模式. 因为官方例子虽然中有更加简洁的ini配置形式,但是使用ini配置无法与spring整合.而且两种配置方法一样,只是格式不一样. 涉及的jar包 ...
- delphi指针简单入门
delphi指针简单入门: 看一个指针用法的例子: 1 var 2 X, Y: Integer; // ...
- 运维自动化之SALTSTACK简单入门
运维自动化之SaltStack简单入门 饱食终日而无所事事,是颓也,废也.但看昨日,费九牛二虎之力除一BUG便流连于新番之中,不知东方之既黑,实乃颓颓然而荒废矣.故今日来缀一文以忏昨日之悔. Salt ...
- Asp.Net MVC学习总结(一)——Asp.Net MVC简单入门
一.MVC简单入门 1.1.MVC概念 视图(View) 代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML.XML和Applet. 模型(Model) 表示用户对其数 ...
随机推荐
- AD域下,域管理员网络无法正常连接
排错思路:1.是否拥有上网权限, test 超级管理员自然是有上网权限的(该项排除): 2.浏览器是否使用了代理 ,有些软件在安装的时候,会自动启用浏览器的代理,开启某些特定的端口: 3.其他原因 解 ...
- LeetCode 332. Reconstruct Itinerary 最小欧拉路径
题意 给N个单词表示N个点,和N-1个单词对,表示可以走的路径,求字典序最小的总路径. 首先说下这么暴力DFS能过.暴力的我都不敢写= = class Solution { public: vecto ...
- SpringBoot项目使用yml文件链接数据库异常
SpringBoot使用properties连接数据库时没有出现问题 SpringBoot使用yml连接数据库时出现:Unable to connect to Redis 并在报错信息中出现: 发现是 ...
- php中的跳转
php中的跳转 header("refresh:3;url=http://www.baidu.com";); <meta http-equiv='refresh' conte ...
- LINQ 统计字符频率
var arr = new string[] {"test","zhulongxu","asdfdgd","yangmi" ...
- 封装setItem 和 getItem 本地存储
store.js 文件 按需导出setItem 和 getItem 函数 :在utils文件里面 : export const setItem = (key, value) => { // 复杂 ...
- 小程序的button组件
button组件 按钮组件 功能比html的button按钮丰富 可以通过open-type属性可以调用微信提供的各种功能(客服,转发,获取用户权限,获取用户信息等): 按钮的属性 size 按钮的大 ...
- 使用rancher cli对接k8s
一.获得rancher的token 1.进入rancher,点击右上角弹出框的ApI&Keys 2.进入页面后选择添加key 3.注意,这里的作用集群范围必须不能指定,否则在jenkins服务 ...
- KubeSphere 社区双周报|2024.05.09-05.23
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- Java消息队列入门详解
什么是消息队列? 消息队列的产生主要是为了解决系统间的异步解耦与确保最终一致性.在实际应用场景中,往往存在一些主流程操作和辅助流程操作,其中主流程需要快速响应用户请求,而辅助流程可能涉及复杂的处理逻辑 ...