上一篇简单的介绍了Shiro的基础认证,这一篇就简单的举个自定义认证的例子
1.和之前一样先引入依赖:
<!--导入shiro-web的依赖 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>${shiro.version}</version>
</dependency>
<!-- 导入shiro-core的依赖 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>${shiro.version}</version>
</dependency>
<!-- 导入shiro-spring 的依赖-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>${shiro.version}</version>
</dependency>
<!-- 导入/commons-logging的依赖 -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
2.配置好自定义Shiro.ini的信息
#自定义认证的全路径限定名
myreal=com.zking.shiro.MyShrioRealm
securityManager.realms=$myreal
3.创建自定义 MyShiroReaml类 继承 AuthorizingRealm(里面有认证和授权的方法)
/**
* 授权
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
/**
* 认证
* @param authenticationToken
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//获取传递过来的数据
UsernamePasswordToken usernamePasswordToken=(UsernamePasswordToken)authenticationToken;
String username=usernamePasswordToken.getUsername();
String pwd=usernamePasswordToken.getPassword().toString();
String dbpwd="123456";
//创建返回数据的认证对象 这里的数据要去和数据库的数据进行比对
//simpleAuthenticationInfo认证数据
//username根据用户找到密码
SimpleAuthenticationInfo simpleAuthenticationInfo=new SimpleAuthenticationInfo(username,dbpwd,this.getName());
//返回认证
return simpleAuthenticationInfo;
}
4.在测试类测试
/**
* shiro的自定义认证realm
*/
@Test
public void test2(){
//读取配置文件 就会新建一个SecurityManager工厂对象 配置信息就会放到对象里面取 注意包
Factory<SecurityManager> factory= new IniSecurityManagerFactory("classpath:shiro2.ini");
//获取SecurityManager对象
SecurityManager securityManager=factory.getInstance();
//将securityManager设置在当前的环境中
SecurityUtils.setSecurityManager(securityManager);
//获取当前操作对象
Subject subject=SecurityUtils.getSubject();
//实例化令牌
UsernamePasswordToken usernamePasswordToken=new UsernamePasswordToken("admin","123456");
//登录 需要一个令牌对象
subject.login(usernamePasswordToken);
//输出看认证是否通过
System.out.println(subject.isAuthenticated());
}
返回结果为true.
自定义认证是根据名称走的,名称去找到密码,在认证的时候就只认证密码就行啦,这就要求名称是唯一的.