自定义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
导向图