目录
前言
这篇文章主要介绍了Shiro基本使用,账号密码信息都使用通过 ini 配置文件获取,了解登录认证流程和角色、授权的方式,Shiro 内嵌很多常用的加密算法,比如 MD5 加密。Shiro 可以很简单的使用信息加密等。
一、添加依赖
我们先搭一个Maven项目,然后添加依赖
<dependencies>
<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>
</dependencies>
二、INI 文件
Shiro 获取权限相关信息可以通过数据库获取,也可以通过 ini 配置文件获取
ini 配置文件可以在项目的resources目录下创建

shiro.ini文件
[users]
admin=123456
query=147852
people=963
三、登录认证
1.概念
- 身份验证:就相当于标明特定的身份ID,例如:账号密码,邮箱,姓名之内的。
-
在shiro中,用户需要提供principals(身份)和credentials(证明)给shiro,从而应用能验证用户身份。
-
principals:身份,一般是用户名、邮箱。credentials:证明/凭证 ,一般是密码、密钥等。
-
最常见的principals和credentials组合就是用户名/密码。
2.登录认证基本流程
- 获取用户的身份信息,即用户名和密码。
-
调用 Subject.login 进行登录,如果失败将得到相应 的 AuthenticationException异常,根据异常提示用户 错误信息;否则登录成功。

-
创建自定义的 Realm 类,继承 AuthenticatingRealm类,实现 doGetAuthenticationInfo() 方法。
public static void main(String[] args) { //1 初始化获取 SecurityManager IniSecurityManagerFactory factory=new IniSecurityManagerFactory("classpath:shiro.ini"); SecurityManager instance = factory.getInstance(); SecurityUtils.setSecurityManager(instance); //2 获取 Subject 对象 Subject subject=SecurityUtils.getSubject(); //3 创建 token 对象,web 应用用户名密码从页面传递 AuthenticationToken token=new UsernamePasswordToken("admin","123456"); //4 完成登录 try { subject.login(token); System.out.println("登录成功"); } catch (UnknownAccountException e) { e.printStackTrace(); System.out.println("用户不存在"); } catch (IncorrectCredentialsException e) { e.printStackTrace(); System.out.println("密码错误"); } catch (AuthenticationException ae) { } }
四、角色、授权
1.授权概念
- 授权,也叫访问控制,即在应用中控制谁访问哪些资源(如访问页面/编辑数据/页面操作 等)。在授权中需了解的几个关键对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)。
-
主体(Subject):访问应用的用户,在 Shiro 中使用 Subject 代表该用户。用户只有授权 后才允许访问相应的资源。
-
资源(Resource):在应用中用户可以访问的 URL,用户只要授权后才能访问。
-
权限(Permission):即权限表示在应用中用户能不能访问某个资源。
-
角色(Role):权限的集合,一般情况下会赋予用户角色而不是权限
2.授权方式
可以使用代码if/else判断
if(subject.hasRole("admin"))
{
//有权限
}else{
//没有权限
}
注解式:通过在执行的Java方法上放置相应的注解完成,没有权限将抛出相应的异常
@RequiresRoles("admin")
3.实现方式
(1)获取角色信息
1、给shiro.ini增加角色配置
[users]
admin=123456,role1234
query=147852
2、使用hasRole()判断用户是否有指定角色
subject.login(token);
System.out.println("登录成功");
//判断角色
boolean role = subject.hasRole("role1234");
System.out.println(role);
(2)判断权限信息信息
1、给shiro.ini增加权限配置
[roles] role1234=user:insert,user:select
2、判断用户是否有指定权限
boolean isPermitted = subject.isPermitted("user:insert");
System.out.println("是否拥有此权限:"+isPermitted);
//用 checkPermission 方法,但没有返回值,没权限抛 AuthenticationException
subject.checkPermission("user:select");
五、Shiro 加密
在有部分开发中,一些敏感信息需要进行加密,比如说用户的密码。Shiro 内嵌很多
常用的加密算法,比如 MD5 加密。Shiro 可以很简单的使用信息加密
使用Shiro进行密码加密
public static void main(String[] args) {
//密码明文
String password = "123456";
//使用md5加密
Md5Hash md5Hash = new Md5Hash(password);
System.out.println("md5加密 = " + md5Hash.toHex());
//带盐的md5加密,盐就是在密码明文后拼接新字符串,然后再进行加密
Md5Hash md5Hash2 = new Md5Hash(password,"admin");
System.out.println("带盐的md5加密 = " + md5Hash2.toHex());
//为了保证安全,避免被破解还可以多次迭代加密,保证数据安全
Md5Hash md5Hash3 = new Md5Hash(password,"admin",3);
System.out.println("md5带盐的3次加密 = " + md5Hash3.toHex());
//使用父类进行加密
SimpleHash simpleHash = new SimpleHash("MD5",password,"admin",3);
System.out.println("父类带盐的3次加密 = " + simpleHash.toHex());
}
通过学习和实践记录笔记,继续加油冲冲冲!