Shiro(1):什么是Shiro
Shiro
Shiro 是 Java 的一个安全框架。Shiro可以帮助我们完成:认证、授权、加密、会话管理、与 Web 集成、缓存等一系列的功能.而且与spring Security相比,Shiro更加小而且简易使用.
Shiro的组件
Subject:即当前用户,在权限管理的应用程序里需要知道谁能够操作什么,谁拥有操作该程序的权利,shiro中则需要通过Subject来提供基础的当前用户信息.这个用户不一定是一个具体的人,与当前应用交互的任何东西都是 Subject
SecurityManager:安全管理器,它是Shiro的核心,管理所有与安全有关的操作和所有的subject.
Realm:Realm是用户的信息认证器和用户的权限人证器,我们需要自己来实现Realm来自定义的管理我们自己系统内部的权限规则。SecurityManager要验证用户,需要从Realm中获取用户。可以把Realm看做是数据源。
简单的身份验证
导入jar包
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.3.2</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
配置文件 shiro.ini
shiro.ini是用来配置用户的登录名与密码,以及其权限,使得SecurityManager验证是否有该用户以及该用户有什么权限
# 模拟这是数据库中的用户信息
# 表示用户名为root,密码为123,权限为login
[users]
root=123,role
[roles]
role=login
现在暂且不连接数据库,而是认为数据库中有这样一个用户:name = root,password = 123 , 接下来,要对登录进来的用户进行验证,判断其用户名与密码是否与数据库的信息一致.
public static void main(String[] args) {
//创建SecurityManager工厂,读取配置文件
//注意导包org.apache.shiro.mgt.SecurityManager
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
//通过SecurityManager工厂获取SecurityManager实例
SecurityManager securityManager = factory.getInstance();
//将SecurityManager对象设置到环境中
SecurityUtils.setSecurityManager(securityManager);
//通过SecurityUtils获取主体Subject
Subject subject = SecurityUtils.getSubject();
//用户登陆的用户名和密码,而ini文件中的用户名和密码相当数据库中的user
UsernamePasswordToken token = new UsernamePasswordToken("root", "123");
try {
//进行用户身份验证,如果验证失败则抛出异常
subject.login(token);
//判断用户是否通过验证
if (subject.isAuthenticated()) {
System.out.println("登陆成功");
}
} catch (AuthenticationException e) {
e.printStackTrace();
System.out.println("用户登陆失败");
}
}
如果用户验证成功,则可以进行下一步操作,而如果验证失败则会抛出AuthenticationException异常.
AuthenticationException异常有几个子类,分别表示验证失败的具体原因:
DisabledAccountException(禁用的帐号)LockedAccountException(锁定的帐号)
UnknownAccountException(错误的帐号)ExcessiveAttemptsException(登录失败次数过多)IncorrectCredentialsException (错误的凭证)ExpiredCredentialsException(过期的凭证)
不过一般我们并不需要给出这么明确的错误信息给登陆用户看