博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shiro的登陆认证(shiro项目中来的一)
阅读量:6093 次
发布时间:2019-06-20

本文共 4124 字,大约阅读时间需要 13 分钟。

一,图解

假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情请点击

 二,流程

2.1,创建token令牌,token中有用户提交的认证信息即账号和密码

1 Subject subject = SecurityUtils.getSubject(); 2 UsernamePasswordToken token = new UsernamePasswordToken(USERNAME, PASSWORD);

 

2.2,执行subject.login(token),最终由securityManager通过Authenticator进行认证 

 subject.login(token);

2.3,Authenticator的实现ModularRealmAuthenticator调用realm从ini配置文件取用户真实的账号和密码

2.4,IniRealm(自定义的)先根据token中的账号去ini中找该账号,如果找不到则给ModularRealmAuthenticator返回null,如果找到则匹配密码,匹配密码成功则认证通过。

1  String username = (String)token.getPrincipal();                  //得到用户名  2          String password = new String((char[])token.getCredentials());     //得到密码 3          Map userMap=new HashMap(); 4          userMap.put("USERNAME", username); 5          userMap.put("PASSWORD", password); 6          pd = userService.getUserByNameAndPwd(userMap); 7          String un=pd.getString("USERNAME"); 8          String ps=pd.getString("PASSWORD"); 9          10          if(null != username && null != password){11              return new SimpleAuthenticationInfo(un, ps, getName());12          }else{13              return null;14          }

 

2.5,解释:因为在这之前已经把从数据库查出来的数据通过SimpleAuthenticationInfo放到ream当中来了。 

三,自定义realm

3.1,自定义realm

1 
2
3
4
5
6
7
8 public class ShiroRealm extends AuthorizingRealm { 9 /*10 * 登录信息和用户验证信息验证(non-Javadoc)11 * @see org.apache.shiro.realm.AuthenticatingRealm#doGetAuthenticationInfo(org.apache.shiro.authc.AuthenticationToken)12 */13 @Override14 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {15 String username = (String)token.getPrincipal(); //得到用户名 16 String password = new String((char[])token.getCredentials()); //得到密码17 if(null != username && null != password){18 return new SimpleAuthenticationInfo(username, password, getName());19 }else{20 return null;21 }22 } 23 /*24 * 授权查询回调函数, 进行鉴权但缓存中无用户的授权信息时调用,负责在应用程序中决定用户的访问控制的方法(non-Javadoc)25 * @see org.apache.shiro.realm.AuthorizingRealm#doGetAuthorizationInfo(org.apache.shiro.subject.PrincipalCollection)26 */27 @Override28 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) {29 System.out.println("========2");30 return null;31 }32 33 }

 

四,shiro的xml文件的解析 

<property name="loginUrl" value="/" />

loginUrl:没有登录的用户请求需要登录的页面时自动跳转到登录页面,不是必须的属性,不输入地址的话会自动寻找项目web项目的根目录下的”/login.jsp”页面。
<property name="successUrl" value="/main/index" />
successUrl:登录成功默认跳转页面,不配置则跳转至”/”。如果登陆前点击的一个需要登录的页面,则在登录自动跳转到那个需要登录的页面。不跳转到此。
<!-- 未认证时要跳转的连接 -->
<property name="unauthorizedUrl" value="/login_toLogin" />
<!-- shiro连接约束配置 -->
<property name="filterChainDefinitions">
<value>
/static/login/** = anon
/plugins/keypad/** = anon
/static/js/myjs/** = authc
/static/js/** = anon
/uploadFiles/uploadImgs/** = anon
/code.do = anon
/login_login = anon
/app**/** = anon
/weixin/** = anon
/** = authc
</value>
</property>
/static/login/** = anon 没有参数,表示可以匿名使用。
authc:例如/static/js/myjs/** =authc表示需要认证(登录)才能使用,没有参数
roles:例子/admins/user/**=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如admins/user/**=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。

perms:例子/admins/user/**=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。

rest:例子/admins/user/**=rest[user],根据请求的方法,相当于/admins/user/**=perms[user:method] ,其中method为post,get,delete等。

port:例子/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString

是你访问的url里的?后面的参数。

authcBasic:例如/admins/user/**=authcBasic没有参数表示httpBasic认证

ssl:例子/admins/user/**=ssl没有参数,表示安全的url请求,协议为https

user:例如/admins/user/**=user没有参数表示必须存在用户,当登入操作时不做检查

注:anon,authcBasic,auchc,user是认证过滤器,

perms,roles,ssl,rest,port是授权过滤器

 

转载地址:http://ftgwa.baihongyu.com/

你可能感兴趣的文章
Ajax异步
查看>>
好记性不如烂笔杆-android学习笔记<十六> switcher和gallery
查看>>
JAVA GC
查看>>
codeforce 599B Spongebob and Joke
查看>>
3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)
查看>>
9、Dubbo-配置(4)
查看>>
前端第七天
查看>>
BZOJ 2190[SDOI2008]仪仗队
查看>>
图解SSH原理及两种登录方法
查看>>
[转载] 七龙珠第一部——第058话 魔境圣地
查看>>
【总结整理】JQuery基础学习---样式篇
查看>>
查询个人站点的文章、分类和标签查询
查看>>
基础知识:数字、字符串、列表 的类型及内置方法
查看>>
JSP的隐式对象
查看>>
P127、面试题20:顺时针打印矩阵
查看>>
JS图片跟着鼠标跑效果
查看>>
[SCOI2005][BZOJ 1084]最大子矩阵
查看>>
学习笔记之Data Visualization
查看>>
Leetcode 3. Longest Substring Without Repeating Characters
查看>>
USB2.0学习笔记连载(十八):keil实现寄存器的配置及相关函数讲解(二)
查看>>