添加依赖:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.3.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
一:
resources下创建 shiro.ini 文件
[users]
zhangsan=123,admin, guest
lisi=456,guest
[roles]
admin=select, save, update, delete
guest=select, update
TestShrio.java
package com.qfedu.test;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.CredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.realm.jdbc.JdbcRealm;
import org.apache.shiro.subject.Subject;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class TestShrio {
DriverManagerDataSource d;
JdbcRealm c;
public static void main(String[] args){
// 构建SecurityManager工厂,IniSecurityManagerFactory可以从ini文件中初始化SecurityManager环境
IniSecurityManagerFactory factory = new IniSecurityManagerFactory();
// 通过工厂创建SecurityManager
SecurityManager manager = factory.getInstance();
// 将SecurityManager设置到运行环境中
SecurityUtils.setSecurityManager(manager);
//创建一个Subject实例,该实例认证需要使用上面创建的SecurityManager
Subject subject = SecurityUtils.getSubject();
Scanner input = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = input.next();
System.out.println("请输入密码:");
String password = input.next();
//创建token令牌,账号和密码是ini文件中配置的
UsernamePasswordToken token = new UsernamePasswordToken(username,password);
try {
//用户登录
subject.login(token);
}catch (UnknownAccountException e){
System.out.println("未知账户");
e.printStackTrace();
}catch (CredentialsException e){
System.out.println("密码错误");
e.printStackTrace();
} catch (AuthenticationException e){
e.printStackTrace();
}
System.out.println(subject.hasRole("admin"));
System.out.println(subject.hasRole("guest"));
List<String> roles = Arrays.asList("admin","guest");
System.out.println(Arrays.toString((subject.hasRoles(roles))));
System.out.println("--------------------------------------");
System.out.println(subject.isPermitted("select"));
System.out.println(subject.isPermitted("save"));
}
}
运行结果:
二:
shiro2.ini
[main]
ds=org.springframework.jdbc.datasource.DriverManagerDataSource
ds.url=jdbc:mysql://localhost:3306/rbac?useSSL=true&serverTimezone=UTC&characterEncoding=UTF-8
ds.username=root
ds.password=root
ds.driverClassName=com.mysql.jdbc.Driver
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.dataSource=$ds
jdbcRealm.authenticationQuery=select password from user where username = ?
securityManager.realm=$jdbcRealm
TestJDBCRealm.java
package com.qfedu.test;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.junit.Test;
public class TestJDBCRealm {
@Test
public void testJDBCRealm(){
IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro2.ini");
SecurityManager manager = factory.getInstance();
SecurityUtils.setSecurityManager(manager);
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("junjun","123456");
subject.login(token);
System.out.println("success");
}
}
运行结果:
注意:
// 构建SecurityManager工厂,IniSecurityManagerFactory可以从ini文件中初始化SecurityManager环境 IniSecurityManagerFactory factory = new IniSecurityManagerFactory();//括号中可以不写ini文件的路径,但是要在resources下名为 shiro.ini 一样才可以哦!不然的话就要 这样写:
IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro2.ini");
拜拜~~~