Java实现Shiro的认证流程:
第一步:
创建一个基础的maven项目引入shiro以及相关依赖包:
<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.4.2</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
第二步:自定义Realms继承AuthorizingRealm
public class MyRealm extends AuthorizingRealm {
/**
*
* 授权
**/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
/**
*
* 登录认证
**/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
return null;
}
}
第三步:创建Shiro配置文件为了建立SecurityManager与Realm关联:
#指定Realm与SecurityManager之间的关联
[main]
MySelfReam=com.shiro.MyRealm
securityManager.realm=$MySelfReam
第四步:编写认证测试代码:
这里shiro.ini的路径我使用绝对路径
public class MyRealmMain {
public static void main(String[] args) {
// 1. 创建管理器工厂
Factory<SecurityManager> factory =new IniSecurityManagerFactory("E:\\hadoop_api\\shiro_demo\\src\\main\\resources\\shiro.ini");
//2.创建安全管理器
SecurityManager manager = factory.getInstance();
// 3. 初始化SecuritUtils 工具类
SecurityUtils.setSecurityManager(manager);
// 4. 通过 SecurityUtils 获取subject
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "123456");
subject.login(token);
// 获取认证结果
Object principal = subject.getPrincipal();
System.out.println("用户登录成功: "+ principal);
}
}
第五步:编写认证核心代码:
/**
*
* 登录认证
**/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("登录认证-------------------");
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
String username = token.getUsername();
// 验证用户名
if(!"zhangsan".equals(username)){
return null;
}
//验证密码[密码正确:认证通过,密码不正确:抛出IncorrectCredentialsException]
AuthenticationInfo info = new SimpleAuthenticationInfo("zhangsan", "123456", "");
return info;
}
第六步:运行main类中的主函数方法。
看到这里可能有小伙伴还是不理解是怎么一个流程,
其实通俗的说就是main函数中的UsernamePasswordToken这个对象中的用户名和密码
传递给了自定义的Realm中的【doGetAuthenticationInfo(AuthenticationToken authenticationToken)】
方法,然后在这个方法能进行用户名密码的比较,如果正确则认证通过用户信息返回,如果不通过就抛出
对应的异常,原理请看下一节。。。。。。。。。。。。。。