shiro的认证流程:(源码大概流程是主体执行登陆验证是通过SecurityManager来操作,核心通过认证器(Authenticator),认证器通过去Realm中寻找数据进行对比验证)
1、创建SecurityManager核心部分,将其设置为环境;
2、获取主体;
3、传入认证数据提交;
4、在这之前别忘记指定存放数据的Realm
shiro验证角色流程与认证登录类似:(源码大概流程主体验证角色时是通过SecurityManager,核心环境通过授权器(Authorizer),授权器通过去Realm的角色数据对比验证)
1、创建SecurityManager核心部分,并将其设置为环境;
2、获取主体;
3、通过主体验证角色;
4、Realm中的角色数据作为标准,可添加多个角色信息
SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();//新建Realms
/**
* 在其中添加用户
*/
@Before
public void addUser(){
simpleAccountRealm.addAccount("0000","000000","admin","super");
}
@Test
public void testAuthtication(){
//创建核心部分的对象(SecurityManager)
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
defaultSecurityManager.setRealm(simpleAccountRealm);//将Realm设置到核心中去
//主体提交认证
SecurityUtils.setSecurityManager(defaultSecurityManager);//工具类把核心部分的对象设置到环境中
Subject subject = SecurityUtils.getSubject();//工具类可以获取主体
//认证数据
UsernamePasswordToken token = new UsernamePasswordToken("0000", "000000");
String message = null;
try {
subject.login(token);//提交认证,到这一步还没有指定Realms
}catch (UnknownAccountException e){
message = "账号不存在";
}catch (IncorrectCredentialsException e){
message = "密码错了";
}
if (subject.isAuthenticated() == true){//验证认证是否通过
message = "登陆成功";
}
//subject.logout();//退出登录
String role = "admin00";
try {
subject.checkRoles(role,"0000");//检查用户角色
}catch (UnauthorizedException e){
System.out.println("用户不是"+e.getLocalizedMessage().substring(e.getLocalizedMessage().indexOf("[")+1,e.getLocalizedMessage().indexOf("]")));
System.out.println(e.getLocalizedMessage());
}
System.out.println(message);
}