- Subject(用户主体)
- SecurityManager(核心安全管理器,认证授权都要经过该对象,相当于springmvc dispatcher)
- realm(数据库)
认证过程


shiro常见异常:

realm接口体系

自定义realm
- 一般都会继承**AuthorizingRealm**抽象类,因为该类具备了缓存,认证,授权的方法。
1. 自定义realm类继承AuthorzingRealm
```java
/**
1. 自定义realm
*/
public class MyRealm extends AuthorizingRealm {
//myrealm设置名字
@Override
public void setName(String name) {
super.setName("myrealm");
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
return null;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//参数 token ; 表示登录时包装的UsernamePasswordToken信息
//获取用户名
String username = token.getPrincipal().toString();
System.out.println(token);
if(!"zhangsan".equals(username)){
return null;
}
String password= "123456";
//info对象表示realm登录比对信息; 参数1,用户信息,餐数2,密码,参数3,当前reaml名字
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username,password,getName());
return info;
}
}
```
2. 自定义realm文件
```java
#自定义realm
myrealm=com.yxt.realm.MyRealm
#指定securityManager的realms实现
securityManager.realms=$myrealm
```
3. 加载配置文件,执行登录操作
```java
public static void main(String[] args) {
//1.创建用户数据
String username = "zhangsan";
String password = "123456";
// 2.创建factory工厂,从ini文件拿数据
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:my-shiro.ini");
//3.使用factory创建SecurityManager (有shiro信息)
DefaultSecurityManager securityManager = (DefaultSecurityManager) factory.getInstance();
//4.将UserRealm注入到完全管理器
/* securityManager.setRealm(new UserRealm2());*/
//5.把当前安全管理器注入到线程中
SecurityUtils.setSecurityManager(securityManager);
//6.获得主体用户
Subject subject = SecurityUtils.getSubject();
//7.将用户名和密码封装到token
UsernamePasswordToken token = new UsernamePasswordToken(username,password);
//8.进行登录
try {
subject.login(token);//进行认证,如果失败会抛异常
System.out.println("登陆成功");
}catch (IncorrectCredentialsException e){
System.out.println("密码不正确");
}catch (UnknownAccountException e){
System.out.println("用户名不存在");
}catch (AuthenticationException e){
System.out.println("用户名或密码正确");
}
// 登出
subject.logout();
}
```
网友评论