Shrio入门
文章目录
- 登录认证
- 角色、授权
- shiro加密
- Shrio自定义登录认证
1、引入依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.9.0</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
2、创建shiro.ini文件
Shiro获取权限相关信息可以通过数据库获取,也可以通过ini配置文件获取,这里演示配置文件
设定账号和密码
[users]
zhangshan=123
lisi=123
登录认证
概念:在shiro中,用户需要提供principals(身份)和credentials(证明)给shiro,从而应用能验证用户身份
最常见的principals和credentials组合就是账号+密码
public class shirotest {
public static void main(String[] args) {
//1、初始化获取SecurityManager
IniSecurityManagerFactory factory=new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
//2、获取Subject对象
Subject subject = SecurityUtils.getSubject();
//3、创建token对象,web应用用户名密码从页面传递
AuthenticationToken token=new UsernamePasswordToken("zhangsan","123");
//4、完成登录
subject.login(token);
//没有抛异常就是登录成功
try {
System.out.println("登录成功");
} catch (UnknownAccountException e) {
e.printStackTrace();
System.out.println("用户不存在");
}
catch (IncorrectCredentialsException e){
e.printStackTrace();
System.out.println("密码错误");
}
}
}
角色、授权
在shiro.ini中添加角色和对应的权限
[users]
zhangsan=123,role1,role2
lisi=123
[roles]
role1=user:insert,user:select
进行角色的判断和权限的判断
public class shirotest {
public static void main(String[] args) {
//1、初始化获取SecurityManager
IniSecurityManagerFactory factory=new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
//2、获取Subject对象
Subject subject = SecurityUtils.getSubject();
//3、创建token对象,web应用用户名密码从页面传递
AuthenticationToken token=new UsernamePasswordToken("zhangsan","123");
//没有抛异常就是登录成功
try {
//4、完成登录
subject.login(token);
System.out.println("登录成功");
//5、判断角色是否存在
boolean hasRole = subject.hasRole("role1");
System.out.println("是否拥有此角色:"+hasRole);
//6、判断权限--也可以使用checkPermission方法,但是没有返回值,没有权限抛出AuthenticationException异常
boolean permitted = subject.isPermitted("user:insert");
System.out.println("是否有user:insert权限:"+permitted);
} catch (UnknownAccountException e) {
e.printStackTrace();
System.out.println("用户不存在");
}
catch (IncorrectCredentialsException e){
e.printStackTrace();
System.out.println("密码错误");
}
}
}
shiro加密
Shiro内嵌很多常用的加密算法,比如MD5加密
public class ShiroMD5 {
public static void main(String[] args) {
//加密
String password="123";
//使用md5加密
Md5Hash md5Hash=new Md5Hash(password);
System.out.println(md5Hash);
//带盐的md5加密
Md5Hash md5Hash2=new Md5Hash(password,"salt");
System.out.println(md5Hash2);
//多次迭代加密
Md5Hash md5Hash3=new Md5Hash(password,"salt",3);
System.out.println(md5Hash3);
//使用父类进行加密
SimpleHash simpleHash=new SimpleHash("MD5",password,"salt",3);
String s = simpleHash.toHex();
System.out.println(s);
}
}
Shrio自定义登录认证
创建MyRealm类继承AuthenticatingRealm
1、自定义登录认证方法,shiro的login方法的底层会调用该类的认证方法进行认证
2、需要配置自定义的realm生效,在ini文件中可以配置,在springboot中可以配置
3、该方法只是获取进行比对的信息,认证逻辑还是按照shiro底层逻辑认证完成
public class MyRealm extends AuthenticatingRealm {
//自定义登录认证方法,shiro的login方法的底层会调用该类的认证方法进行认证
//需要配置自定义的realm生效,在ini文件中可以配置,在springboot中可以配置
//该方法只是获取进行比对的信息,认证逻辑还是按照shiro底层逻辑认证完成
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//1、获取身份信息
String principal = authenticationToken.getPrincipal().toString();
//2、获取凭证信息
String password=new String((char[]) authenticationToken.getCredentials());
//3、访问一下数据库获取用户信息(模拟)
System.out.println(principal+password);
if (principal.equals("zhangsan")){
//获取出数据库中存储的加盐3次迭代密码,这里是123
String pwd="07ca00e10899418f0ea4ab92a9d69065";
//4、创建封装校验逻辑对象,封装数据返回
//身份信息,密码信息,
AuthenticationInfo info=new SimpleAuthenticationInfo(
authenticationToken.getPrincipal(),//身份信息
pwd,//加密后的密码
ByteSource.Util.bytes("salt"),//加密的盐
authenticationToken.getPrincipal().toString()
);
return info;
}
return null;
}
}
这里是使用ini文件进行配置
在shiro.ini中添加
[main]
md5CredentialsMatcher=org.apache.shiro.authc.credential.Md5CredentialsMatcher
md5CredentialsMatcher.hashIterations=3
myrealm=com.atguigu.MyRealm //MyRealm类所在位置
myrealm.credentialsMatcher=$md5CredentialsMatcher
securityManager.realms=$myrealm