1.权限的管理
1.1什么是权限管理:
基本上涉及用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。
权限管理包括用户身份认证和授权两部分,简称认证授权,对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。
1.2什么是身份认证
身份认证,就是判断一个用户是否为合法用户的处理过程,最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的用户名和口令一直,来判断用户是否正确,对于采用指纹等系统,则出示指纹,对于硬件key等刷卡系统,则需要刷卡。
1.3什么是授权
授权,即访问控制,控制谁能访问那些资源,主体进行身份认证后需要分配权限放可访问系统的资源,对于某些资源没有权限是无法访问的。
4.shiro中的认证
4.1认证:身份认证,就是判断一个用户是否为合法用户的处理过程,最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。
4.2shiro中认证的关键对象
subject:主体,访问系统的用户,主体可以是用户,程序等,进行认证的都称为主体;
principal:身份信息,是主体(subject)进行身份认证的标识,标识必须具有唯一性,如用户名,手机好,邮箱地址等,一个主体可以有多个身份,但是必须有一个主身份。
credential:凭证信息,是只有主体自己知道的安全信息,如密码,证书等。
4.3认证流程
4.4认证的开发
4.4.1项目中添加依赖
<!--引入shiro的依赖-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.5.3</version>
</dependency>
4.4.2添加shiro的ini配置文件,shiro 的ini配置文件是用来学习shiro书写我们系统中相关权限数据,减少学习阶段从数据库中获取数据的难度,真正项目整合的时候用不到。
配置如下:
4.4.3认证过程:
a.先执行用户名比较,通过simpleAccountRealm中的doGetAuthenticationInfo这个方法中完成对用户名校验
b.其次执行密码校验,通过AuthenticatingRealm中assertCredentialsMatch这个方法中完成对密码校验
自定义Realm,实现shiro认证
/**
* 自定义realm实现,将认证、授权数据的来源转化为数据库的实现
*/
public class CustomerRealm extends AuthorizingRealm {
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
// 认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//获取用户名
String principal = (String)authenticationToken.getPrincipal();
System.out.println(principal);
//通过jdbc,mybatis查询相关数据库
if("xiaochen".equals(principal)){
//参数1 返回数据库中正确的用户名,参数2:返回数据库中正确密码, 参数3:提供当前realm的名字,this.getName();
SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(principal,"123",this.getName());
return simpleAuthenticationInfo;
}
return null;
}
}
自定义shiro认证测试
public class TestCustomerRealmAuthenticator {
public static void main(String[] args) {
//创建securityManager
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
//设置自定义realm
defaultSecurityManager.setRealm(new CustomerRealm());
//设置安全工具类
SecurityUtils.setSecurityManager(defaultSecurityManager);
//通过安全工具类获取subject
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("xiaochen", "123");
try {
subject.login(token);
}catch (IncorrectCredentialsException e){
e.printStackTrace();
System.out.println("密码错误");
}catch (UnknownAccountException e){
e.printStackTrace();
System.out.println("用户名错误");
}
}
}
MD5算法
tomcat.zip tomcat.md5
作用:一般用来加密或签名
特点:MD5算法不可逆,如何内容相同无论执行多少次md5生成的结果始终一致,而且始终是一个16进制32位长度字符串,如果需要更安全,需要添加随机盐。
shiro中授权变成实现方式
编程式
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole("admin")){
//有权限
}else{
//无权限
}
注解式:
@RequiresRoles("admin")
public void hello(){
// admin账号有权限
}
标签式:
<shiro:hasRole name = "admin">
</shiro:hasRole>
6.shiro整合springboot项目实战