1、pom.xml添加依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.4.0</version>
</dependency>
2、创建realm.java,继承AuthorizingRealm ,重写doGetAuthorizationInfo,doGetAuthenticationInfo方法
// 授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principalCollection) {
return null;
}
// 认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
throws AuthenticationException {
System.out.println(getName());
//还记得吗,token封装了客户端的帐号密码,由Subject拉客并最终带到此处
String clientUsername = (String) token.getPrincipal();
//模拟一个Service
SecurityService securityService = new SecurityService();
//通过Service查询数据库,获取到正确的密码
String passwordFromDB = securityService.findPasswordByUsername(clientUsername);
if (passwordFromDB == null) {
//如果根据用户输入的用户名,去数据库中没有查询到相关的密码
throw new UnknownAccountException();
}
return new SimpleAuthenticationInfo(clientUsername,passwordFromDB,getName());
3、编写测试代码
// 注意:这里 SecurityManager 所在的包名
// 读取配置文件,初始化SecurityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
// 把 securityManager 的实例绑定到 SecurityUtils 上
SecurityUtils.setSecurityManager(securityManager);
// 得到当前执行的用户
Subject currentUser = SecurityUtils.getSubject();
// 自己创建一个令牌
UsernamePasswordToken token = new UsernamePasswordToken("zhouguang","123456");
try {
// 身份认证
currentUser.login(token);
System.out.println("身份认证成功");
} catch (AuthenticationException e) {
System.out.println("认证失败");
e.printStackTrace();
}
System.out.println("退出登录");
// 最后别忘了退出登录(shiro还会做很多操作,从控制台就可以看出)
currentUser.logout();
System.out.println("退出登录成功");
4、配置shiro.ini文件
在resources中创建shiro.ini文件,在文件中添加
[main] myRealm=com.xjl.shrio.MyRealm securityManager.realms=$myRealm