建立数据库
建立5张表,分别是用户表、角色表、权限表、用户角色表、角色权限表:
其中用户表、角色表、权限表是实体表,用户角色表、角色权限表是功能表,用于连接三张实体表。
注入依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-web-starter</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.crazycake</groupId>
<artifactId>shiro-redis</artifactId>
<version>3.1.0</version>
</dependency>
创建实体model和dao层
这里用到maven自动工具,故不细说。
但是有一点需要提到的是,其中由于用户表需要实现持久化,所以用户类需要继承Serializable这个接口,至于为什么要用到接口Serializable,参考博客:为什么要实现Serializable
写redis配置
在application.yml中配置redis相关静态变量,如下:
shiro:
redis:
host: 127.0.0.1:6379
timeout: 1800000
这里只写了端口与连接超时时长。
接着写一个redis的配置类:
@Configuration
public class New_RedisConfig {
@Value("${shiro.redis.host}")
private String host;
@Value("${shiro.redis.timeout}")
private int timeout;
// private String password;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getTimeout() {
return timeout;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
}
自定义realm
public class UserRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
@Autowired
private IAuthQueryService authQueryService;
/**
* 执行授权逻辑
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行授权逻辑");
if (principalCollection == null) {
throw new AuthorizationException("PrincipalCollection method argument cannot be null.");
}
Object principal = getAvailablePrincipal(principalCollection);
if(