Shiro:学习笔记——身份验证
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shiro:学习笔记——身份验证相关的知识,希望对你有一定的参考价值。
Shiro——学习笔记(1)
1.核心概念
1.Shiro不会自己去维护用户、维护权限;这些需要我们自己去设计/提供;然后通过相应的接口注入给Shiro。
2.应用代码直接交互的对象是Subject,也就是说Shiro的对外核心是Subject;
Subject:主体,代表了当前用户,不一定是一个具体的人,与当前交互的任何东西都是Subject,如网络爬虫、机器人等,是一个抽象概念。所有的Subject都会绑定到SecurityManager。可以把Subject认为是一个门面;SecurityManager才是实际的执行者。
Security Manager:安全管理器;即所有与安全有关的操作都会与SecurityManager交互;且它管理着所有的Subject,且负责与后面介绍的其他组件进行交互。它是Shiro内部的核心。可以理解为前端控制器。
Realm:域,Shiro从Realms获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,他需要从Realm获取相应的用户进行比较以确定用户身份是否合法。可以看作是DataSource,即安全数据源。
2.HelloWorld代码:
//获取SecurityManager工厂,此处使用ini配置文件初始化SecurityManager Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-jdbc-realm.ini"); //得到SecurityManager实例,并绑定给SecurityUtils SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); //得到Subject及创建用户名/密码身份验证Token Subject subject =SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("zhang","123"); try { //登陆,即身份验证 subject.login(token); }catch (AuthenticationException e) { //身份验证失败 } System.out.println(subject.isAuthenticated()); //用户已经登陆 //退出 subject.logout();
基于ini的验证方式
[users] zhang=123 wang=132
自定义Realm
package main.realm; import org.apache.shiro.authc.*; import org.apache.shiro.realm.Realm; /** * Created by ZY on 2017/9/12. */ public class MyRealm implements Realm { /** * 返回一个唯一的Realm名字 * @return */ public String getName() { return "MyRealm"; } /** * 判断此Realms是否支持此Token * @param authenticationToken * @return */ public boolean supports(AuthenticationToken authenticationToken) { //仅支持UsernamePassword类型的Token return authenticationToken instanceof UsernamePasswordToken; } /** * 根据Token获取认证信息 * @param authenticationToken * @return * @throws AuthenticationException */ public AuthenticationInfo getAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { String username = (String) authenticationToken.getPrincipal(); //得到用户名 String password =new String((char[])authenticationToken.getCredentials()); //得到密码 if(!"zha".equals(username)) { throw new UnknownAccountException(); //如果用户名错误 } if(!"123".equals(password)) { throw new IncorrectCredentialsException(); //如果密码错误。 } //如果验证成功,返回一个实现。 return new SimpleAuthenticationInfo(username,password,getName()); } }
myRealm1=main.realm.MyRealm
securityManager.realms=$myRealm1
基于数据库的方式
[main] jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm dataSource=com.alibaba.druid.pool.DruidDataSource dataSource.driverClassName=com.mysql.jdbc.Driver dataSource.url=jdbc:mysql://localhost:3306/shiro dataSource.username=root dataSource.password=123456 jdbcRealm.dataSource=$dataSource securityManager.realms=$jdbcRealm
以上是关于Shiro:学习笔记——身份验证的主要内容,如果未能解决你的问题,请参考以下文章