步骤
- 建立一个类 继承AuthorizingRealm类
- 建立一个Shiro的文件 shiro-realm.ini
- 编写,验证方法
自定义Realm类
package com.shiro.diy;
import org.apache.log4j.Logger;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
public class ShiroDiy extends AuthorizingRealm {
Logger logger=Logger.getLogger(ShiroDiy.class);
//授权方法
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
//获取,认证时,令牌传递过来的第一个参数的值
String name=(String) principals.getPrimaryPrincipal();
//这里,我直接,自己定死。可以从数据库中拿值
//建立,简单的授权,信息对象
SimpleAuthorizationInfo Authorization=new SimpleAuthorizationInfo();
//设定角色,每次,只能添加一个
Authorization.addRole("testOne");
//设定资源(权限)
Authorization.addStringPermissions(Arrays.asList("test:insert","test"));
//再次,设定 角色
Authorization.addRole("testTwo");
Authorization.addStringPermissions(Arrays.asList("test:insert","test","test:delete"));
return Authorization;
}
//认证方法
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken Token) throws AuthenticationException {
//取到,需要认证的 账号
String name=(String) Token.getPrincipal();
logger.info("验证的账号是:"+name);
//假设已经取到密码 ,
String passworid="123";
//中间,编写代码。。。。。
//建立 简单的验证信息对象 参数一: 需要验证的账号 参数二:需要验证的密码 参数三:本类的常量,取的是,shiro.realm.xml 中的本类
SimpleAuthenticationInfo simpleAuthenticationInfo=new SimpleAuthenticationInfo(name, passworid,this.getName());
//最后,返回,验证信息对象,因为,验证结果,已经储存在本对象中
return simpleAuthenticationInfo;
}
}
建立配置文件
Test类
@Test
public void TestDiy(){
//取的 安全管理器 工厂
Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro-realm.ini");
//从工厂类中,取到安全管理器
SecurityManager securityManager=factory.getInstance();
//把 安全管理器 注入当前 环境
SecurityUtils.setSecurityManager(securityManager);
//取到 subject 对象
Subject subject= SecurityUtils.getSubject();
//实例化 令牌
UsernamePasswordToken usernamePasswordToken=new UsernamePasswordToken("fsd","12s3");
//执行认证
subject.login(usernamePasswordToken);
//认证,结果
boolean info=subject.isAuthenticated();
System.out.println("认证状态:"+info);
//认证,注销后
subject.logout();
boolean infoTwo=subject.isAuthenticated();
System.out.println("注销后:"+infoTwo);
}
结果
未引入Logging
导向图