realm:域shiro是从realm获取安全数据(eg: 用户、角色、权限),就是说SecurityManger要验证用户身份,那么须要从Realm获取相应的用户进行比较肯定用户身份是否合法;也须要从Realm获得相应用户的角色/权限进行验证用户是否能进行操做;能够把Realm当作DataSource,即数据源。以前用的是ini的配置方式将使用org.apache.shiro.realm.text.IniRealm。
org.apache.shiro.realm.Realm 接口以下:算法
String getName(); //返回一个惟一的Realm名字 boolean supports(AuthenticationToken token); //判断此Realm是否支持此Token AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException; //根据Token获取认证信息
public class MyRealm extends AuthorizingRealm { @Override public String getName() { return "MyRealm"; } // 受权 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { return null; } // 身份认证 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { //用户名 String userName = (String) authenticationToken.getPrincipal(); if(!"zhangsan".equals(userName)){ return null; } //假设从数据库读出来的密码是222 String password="222"; AuthenticationInfo authenticationInfo=new SimpleAuthenticationInfo(userName,password,getName()); return authenticationInfo; } };
#声明一个realm MyRealm=com.tuyue.shiro.MyRealm #指定securityManager的realms实现 securityManager.realms=$MyRealm
测试结果spring
@Test public void realm1() { //获取SecurityManager的实例 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:realm.ini"); SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "222"); subject.login(token); //验证登陆是否成功 log.info("登陆是否成功!"+subject.isAuthenticated()); subject.logout(); log.info("登陆是否成功!"+subject.isAuthenticated()); } 2018-09-30 11:45:11.616 INFO 8056 --- [ main] a.s.s.m.AbstractValidatingSessionManager : Enabling session validation scheduler... 2018-09-30 11:45:11.746 INFO 8056 --- [ main] c.tuyue.SpringbootshiroApplicationTests : 登陆是否成功!true 2018-09-30 11:45:11.747 INFO 8056 --- [ main] c.tuyue.SpringbootshiroApplicationTests : 登陆是否成功!false 2018-09-30 11:45:11.750 INFO 8056 --- [ Thread-2] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@16610890: startup date [Sun Sep 30 11:45:11 CST 2018]; root of context hierarchy
通常状况下在数据库存的用户密码是加密后的,那么这种状况shiro是怎么验证的呢?
咱们先了解一个概念:散列算法
散列算法 通常用于生成数据的摘要信息,是一种不可逆的算法,通常适合存储密码之类的数据,常见的散列算法如MD五、SHA等。通常进行散列时最好提供一个salt(盐),好比加密密码“admin”,产生的散列值是“21232f297a57a5a743894a0e4a801fc3”,能够到一些md5解密网站很容易的经过散列值获得密码“admin”,即若是直接对密码进行散列相对来讲破解更容易,此时咱们能够加一些只有系统知道的干扰数据,如用户名和ID(即盐);这样散列的对象是“密码+用户名+ID”,这样生成的散列值相对来讲更难破解。
闲话很少说直接上手
1: 先模拟数据的加密操做数据库
public class PasswordMd5 { public static void main(String[] args) { String password ="222"; //加密以后 Md5Hash md5Hash=new Md5Hash(password); System.out.println("md5加密:"+md5Hash); //md5+加盐 Md5Hash md5Hash1=new Md5Hash(password,"123"); System.out.println("md5加密加盐:"+md5Hash1); //md5+盐+散列次数 Md5Hash md5Hash2=new Md5Hash(password,"1234",3); System.out.println("md5+盐+散列次数:"+md5Hash2); } } md5加密: bcbe3365e6ac95ea2c0343a2395834dd md5加密加盐: ea281b47cb711da418c35b07b9f06cd5 md5+盐+散列次数:148dc8607c574b5ddfb8845f55536cca
2:编写加密的ini文件apache
[main] #定义凭证匹配器 credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher #指定散列算法 credentialsMatcher.hashAlgorithmName=md5 #指定散列次数 credentialsMatcher.hashIterations=3 myRealm=com.tuyue.shiro.MyRealm myRealm.credentialsMatcher=$credentialsMatcher #指定securityManager的realms实现 securityManager.realms=$myRealm
3.测试结果安全
@Test public void realm1() { //获取SecurityManager的实例 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:Passwordrealm.ini"); SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "222"); subject.login(token); //验证登陆是否成功 log.info("登陆是否成功!"+subject.isAuthenticated()); subject.logout(); log.info("登陆是否成功!"+subject.isAuthenticated()); } 2018-09-30 17:20:30.006 INFO 10120 --- [ main] c.tuyue.SpringbootshiroApplicationTests : 登陆是否成功!true 2018-09-30 17:20:30.006 INFO 10120 --- [ main] c.tuyue.SpringbootshiroApplicationTests : 登陆是否成功!false