shiro是什么
shiro一个授权和认证的这样一个框架
简单的给你说、就是以前咋们认证和授权的所有代码、shiro都给咋们写好了、而且封装好了、我们只需要按照这个框架提供的API来简单的集成到咋们的项目中就可以了
1、shiro能干什么
认证、授权、Cache的管理、Session的管理、rememberMe功能的实现、登陆、退出…
2、shiro的整体架构是什么
3、shiro的第一个helloworld程序
3.1、导包
<!--导入shiro的包-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.3.2</version>
</dependency>
3.2、在resource下创建模拟数据库的文件
[users]
admin=123
zhangsan=123
3.3、编写测试代码完成用户的认证
public static void main(String[] args){
//获取安全管理器的工厂
IniSecurityManagerFactory securityManagerFactory = new IniSecurityManagerFactory("classpath:shiro.ini");
//通过安全管理器的工厂 获取安全管理器
SecurityManager securityManager = securityManagerFactory.createInstance();
//将安全管理器设置到运行环境中
SecurityUtils.setSecurityManager(securityManager);
//获取当前操作的主体
Subject subject = SecurityUtils.getSubject();
//接下来就应该将用户名和密码丢进去测试了
//用户名 和 密码 =====> 应该是前端页面传过来的
//创建token
UsernamePasswordToken passwordToken = new UsernamePasswordToken("admin","123");
//传递token进行校验
subject.login(passwordToken);
//这里的校验是去 shiro的内部进行校验
System.out.println("用户的认证状态:"+subject.isAuthenticated());
subject.logout();
System.out.println("用户的状态是:"+subject.isAuthenticated());
}
4、源码的解读
DelegatingSubject.java
DefaultSecurityManager.java
AuthenticatingSecurityManager.java
AbstractAuthenticator.java
ModularRealmAuthenticator.java
AuthenticatingRealm.java
SimpleAccountRealm.java
比较密码的时候执行的方法AuthenticatingRealm.java
HashedCredentialsMatcher.java
SimpleCredentialsMatcher.java
5、源码的流程图
6、自定义realm的实现
6.1、自定义一个realm
public class MyRealm extends AuthorizingRealm {
private UserDAO userDAO=new UserDAO();
@Override
public String getName() {
return "MyRealm";
}
/**
*这个方法是用来进行认证的
* @param authenticationToken
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//第一步:通过token获取到用户数据
String userName = (String) authenticationToken.getPrincipal();
//第二步:通过用户名 去数据库查询用户对象
User user=null;
try {
user = userDAO.findUserByName(userName);
System.out.println("从数据库查询出来的数据是:"+user);
} catch (Exception e) {
System.out.println("查询失败:"+e.fillInStackTrace());
}
if(null==user){ //说明数据库里面没有查询出数据来
return null;
}
//用户信息查询出来了
//User user = new User(1, "admin", "123");
SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(user.getUserName(),user.getPassword(),getName());
return simpleAuthenticationInfo;
}
/**
* 做用户授权的
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
}
6.2、编写配置文件
[main]
customRealm=com.qf.shiro.realm.MyRealm
securityManager.realms=$customRealm
7.shiro中常见的名词解释
Subject:登陆的这个用户(用户、程序) 、谁认证那么这个主体就是谁
Principal:用户名(还可以是用户信息的封装)
Credential:密码
Token:令牌(用户名+密码的封装)----进行进行认证的封装对象
这个的对象并不是前后分离的这个token
Security Manager:安全管理器(只要使用了shiro框架那么这个对象都是必不可少的)
Authenticator:认证器(主要做用户身份认证、简单跟你说就是用来登陆的时候做身份校验的)
Authrizer:授权器(简单的说就是用来做用户的授权的)
Realm:用户认证和授权的时候 和数据库交互的对象(这里面干的事情就是从数据库查询数据 封装成token然后取进行认证和授权)
8、常见的两个异常
8.1、用户名不对的异常
Exception in thread "main" org.apache.shiro.authc.UnknownAccountException
8.2、密码不对的异常
Exception in thread "main" org.apache.shiro.authc.IncorrectCredentialsException