shrio是一个框架(这里我们使用自定义realm)
有四大基石,身份验证,授权,密码学,会话管理(这里的session可以放在任何B/S或者C/S中)
使用需要导入pom,调用
在pxm中导入
<dependencies> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
自定realm
package cn.jiedada.shiro; import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.util.ByteSource; import java.util.HashSet; import java.util.Set; public class MyRealm extends AuthorizingRealm { /*授权 * */ protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo(); //设置冲数据库中传来的角色 simpleAuthorizationInfo.setRoles(this.getRoles()); //设置冲数据库中传来的权限 simpleAuthorizationInfo.setStringPermissions(getPerms()); return simpleAuthorizationInfo; } private Set getRoles(){ Set set = new HashSet(); set.add("admin"); return set; } private Set getPerms(){ Set set = new HashSet(); set.add("*"); return set; } /*身份验证 返回值null为用户名错误 * */ protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { //获得token序列 UsernamePasswordToken token=(UsernamePasswordToken)authenticationToken; //获得用户名 String username = token.getUsername(); //去数据库查询密码 String pwd = getUsers(username); if(pwd!=null){ //验证密码,传入三个参数 //设置盐 ByteSource byteSource = ByteSource.Util.bytes("jiedada"); SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(username,pwd,byteSource,"myshiro"); return simpleAuthenticationInfo; } return null; } private String getUsers(String username){ if("adimn".equals(username)){ return "2a7e4163f7f9f316d03c3f384eeb301b"; } return null; } }
测试(这里有自动生成的密码加密)
package cn.jiedada.shiro; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.IncorrectCredentialsException; import org.apache.shiro.authc.UnknownAccountException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.authc.credential.HashedCredentialsMatcher; import org.apache.shiro.crypto.hash.SimpleHash; import org.apache.shiro.mgt.DefaultSecurityManager; import org.apache.shiro.subject.Subject; import org.junit.Test; public class MyShiroTest { @Test public void test01() throws Exception{ //自定义securityManager MyRealm myRealm = new MyRealm(); DefaultSecurityManager securityManager = new DefaultSecurityManager(); //把我们的realm传入其中 securityManager.setRealm(myRealm); /* SecurityUtils.setSecurityManager(securityManager) 设置在上下文路径中 */ SecurityUtils.setSecurityManager(securityManager); //获得游客或者对象 Subject currentUser = SecurityUtils.getSubject(); /*设置解码器*/ HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher(); hashedCredentialsMatcher.setHashAlgorithmName("MD5"); hashedCredentialsMatcher.setHashIterations(10); //设置hashedCredentialsMatcher()设置到我们的myRealm中 myRealm.setCredentialsMatcher(hashedCredentialsMatcher); //currentUser.isAuthenticated()判断是否存在有currentUser System.out.println("是否有上下文对象:"+currentUser.isAuthenticated()); if(!currentUser.isAuthenticated()){ //获得令牌传入参数,判断是否是正确的 try { UsernamePasswordToken token = new UsernamePasswordToken("adimn","123456"); //使用当前用户经行添加 currentUser.login(token); }catch (UnknownAccountException e){ //判断用户名是否错误 e.printStackTrace(); System.out.println("是请输入正确的用户名"); } catch (IncorrectCredentialsException e){ //判断密码是否错误 e.printStackTrace(); System.out.println("是请输入正确的密码"); }catch (AuthenticationException e) { //所有的错误 e.printStackTrace(); System.out.println("未知错误"); } } System.out.println("是否有上下文对象:"+currentUser.isAuthenticated()); System.out.println("是否有上下文对象:"+currentUser.hasRole("sad")); System.out.println("是否有上下文对象:"+currentUser.isPermitted("employee:save")); } /*密码加密 algorithmName:为我们的加密算法 source:为我们的密码 salt:是否加盐 hashIterations:迭代次数 MD5 e10adc3949ba59abbe56e057f20f883e 10次 4a95737b032e98a50c056c41f2fa9ec6 2a7e4163f7f9f316d03c3f384eeb301b * */ @Test public void test0pwd() throws Exception{ SimpleHash hash = new SimpleHash("MD5","123456","jiedada",10); System.out.println(hash.toString()); } }