Shiro是不依赖于容器的,所以建立一个普通的Maven项目就可以。
搭建maven项目框架
以上是刚创建的maven项目架构
以下导入shiro依赖
<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.4.2</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
导入依赖之后,我们要创建ini配置文件,以后就在这个配置文件里面写固定的数据,让shiro框架读取这个配置文件实现认证和授权。
这个配置文件就相当于数据库
以上写一个ini的配置文件,里面存储键值对,也就是用户名和密码,相当于数据库
第一个项目演示
现在开始写代码,实现将前段传过来的用户名和密码,和这个配置文件里面的用户名和密码进行对比,看是不是一样
public class ShiroRun {
public static void main(String[] args) {
//1.获取SecurityManager的工厂对象
IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
//2.生产SecurityManager对象
SecurityManager securityManager = factory.getInstance();
//3.将生产的SecurityManager存储到SecurityUtils中,保证SecurityManager在
// 一次请内的任意位置获取的是同一个SecurityManager对象,不同的请求获取的是不同的。
SecurityUtils.setSecurityManager(securityManager);
//4.获取subject对象完成认证
Subject subject = SecurityUtils.getSubject();
//5.创建认证信息对象,存储认证数据
也就是前段传过来的用户名和密码保存在这个里面
//web项目时,用户名和密码是客户端表单传递过来的用户名和密码。
AuthenticationToken token = new UsernamePasswordToken("zhangsan", "zs");
try {
//login()方法没有返回值,只能通过是否有异常判断是否登录成功。
login() 这个方法自动会将token里面的用户名和密码和
ini配置文件里面的数据进行对比,看有没有前段传过来的数据
subject.login(token);
如果有,就执行下一句,没有就执行catch里面的数据
System.out.println("登录成功");
} catch (UnknownAccountException e) {
System.out.println("账号不存在");
} catch (IncorrectCredentialsException e) {
System.out.println("密码错误");
} catch (AuthenticationException e) {
e.printStackTrace();
}
}
}
public class ShiroRun {
public static void main(String[] args) {
//1.获取SecurityManager的工厂对象
IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
//2.生产SecurityManager对象
SecurityManager securityManager = factory.getInstance();
//3.将生产的SecurityManager存储到SecurityUtils中,保证SecurityManager在
// 一次请内的任意位置获取的是同一个SecurityManager对象,不同的请求获取的是不同的。
SecurityUtils.setSecurityManager(securityManager);
//4.获取subject对象完成认证
Subject subject = SecurityUtils.getSubject();
//5.创建认证信息对象,存储认证数据
AuthenticationToken token = new UsernamePasswordToken("zhangsan", "zs");
//6.完成认证操作
try{
// subject这个对象里面就有ini 配置文件里面的所有的东西
subject.login(token);
System.out.println("登录成功");
//7.角色的验证
//单个角色验证
boolean role1 = subject.hasRole("role1");//判断当前人认证的账户手否具备某个角色
//多个角色验证
//创建List集合存储要验证的角色名
ArrayList<String> list=new ArrayList();
list.add("role1");
list.add("role2");
//验证
boolean[] booleans = subject.hasRoles(list);
System.out.println(booleans[0]+""+booleans[1]);
//8.权限的验证,如果不具备该权限则报错
subject.checkPermission("user:insert");//单个权限验证
boolean permitted = subject.isPermitted("user:insert");//返回true|false
System.out.println(permitted);
}catch (UnknownAccountException u){
System.out.println("账户不正确");
}catch (IncorrectCredentialsException i){
System.out.println("凭证错误");
}
catch (Exception e){
e.printStackTrace();
}
}
}
以上代码解释:
subject这个对象里面就有ini 配置文件里面的所有的东西,以后我们把想要认证的东西,作为参数传到这个subject对象里面的某些方法就可以实现功能。那么这个subject对象里面有什么方法呢?
subject 对象
login()方法
subject对象里面有一个login方法,这个login方法的参数是一个接口
这个接口的实现类是有一个
我们现在要实现登录,前段传过来用户名和密码,我们要把用户名和密码放到
UsernamePasswordToken这个实现类里面,然后将这个实现类作为参数传到login()方法里面就可以实现认证登录
前段传过来的用户名和密码放到UsernamePasswordToken对象里面
//5.创建认证信息对象,存储认证数据
AuthenticationToken token = new
UsernamePasswordToken("zhangsan", "zs");
//实现认证登录
subject.login(token);
hasRole()方法
这个方法是判断 当前用户是否有一定的角色,参数是角色的名字,string类型的。
//单个角色验证 //判断当前人认证的账户手否具备某个角色
boolean role1 = subject.hasRole("role1");
//多个角色验证
//创建List集合存储要验证的角色名
ArrayList<String> list=new ArrayList();
list.add("role1");
list.add("role2");
//验证
boolean[] booleans = subject.hasRoles(list);
System.out.println(booleans[0]+""+booleans[1]);
checkPermission()方法
通过是否出现AuthenticationException异常控制是否有指定权限。
//权限的验证,如果不具备该权限则报错
subject.checkPermission("user:insert");//单个权限验证
isPermitted()方法
boolean permitted = subject.isPermitted("user:insert");
//返回true|false
加密及凭证匹配器
在实际开发中数据库中一些敏感信息经常会被加密存储。如:用户密码等。
Shiro框架内嵌了很多加密算法。如MD5等。使用Shiro框架时可以
很方便的实现加密功能。
使用Shiro框架对前段传过来的密码进行加密,然后和数据库中的加密的密码进行比较。
public class MD5Test {
public static void main(String[] args) {
String password = "jing";
//md5加密
Md5Hash md5Hash = new Md5Hash(password);
System.out.println(md5Hash);
//带盐的MD5加密。盐就是在原有字符串后面拼接盐形成新的字符串,然后加密。
Md5Hash md5Hash2 = new Md5Hash(password, "010305");
System.out.println(md5Hash2);
//无论是否加盐都可以很容易的被破解,可以多次迭代加密保证数据安全性。
//第三个参数表示迭代加密次数
Md5Hash md5Hash3 = new Md5Hash(password, "010305", 2);
System.out.println(md5Hash3);
//使用Md5的父类也也实现
SimpleHash simpleHash = new SimpleHash("md5",password,"010305",2);
System.out.println(simpleHash);
}
}