模型
假设存在用户(User)、角色(Role)、权限(Permission)3中模型。依赖关系如下:
用户分配角色,角色分配权限。用户不直接参与权限的分配。
SpringBoot集成Shiro流程
demo的代码架构如下:
创建IO模型
User存在:1、唯一ID 2、用户名 3、密码 4、拥有的Role
public class
User {
private
Integer
uid
;
private
String
username
;
private
String
password
;
private
Set<Role>
roles
=
new
HashSet<>()
;
}
Role存在:1、唯一ID 2、角色名 3、角色拥有的权限 4、拥有该角色的用户(可以不需要)
public class
Role {
private
Integer
rid
;
private
String
rname
;
private
Set<Permission>
permissions
=
new
HashSet<>()
;
private
Set<User>
users
=
new
HashSet<>()
;
}
Permission存在:1、唯一ID 2、权限名 3、。。。
public class
Permission {
private
Integer
pid
;
private
String
name
;
private
String
url
;
}
数据库sql如下:
-- 权限表 --
CREATE TABLE permission (
pid int(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL DEFAULT '',
url VARCHAR(255) DEFAULT '',
PRIMARY KEY (pid)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
INSERT INTO permission VALUES ('1', 'add', '');
INSERT INTO permission VALUES ('2', 'delete', '');
INSERT INTO permission VALUES ('3', 'edit', '');
INSERT INTO permission VALUES ('4', 'query', '');
-- 用户表 --
CREATE TABLE user(
uid int(11) NOT NULL AUTO_INCREMENT,
username VARCHAR(255) NOT NULL DEFAULT '',
password VARCHAR(255) NOT NULL DEFAULT '',
PRIMARY KEY (uid)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
INSERT INTO user VALUES ('1', 'admin', '123');
INSERT INTO user VALUES ('2', 'demo', '123');
-- 角色表 --
CREATE TABLE role(
rid int(11) NOT NULL AUTO_INCREMENT,
rname VARCHAR(255) NOT NULL DEFAULT '',
PRIMARY KEY (rid)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
INSERT INTO role VALUES ('1', 'admin');
INSERT INTO role VALUES ('2', 'customer');
-- 权限角色关系表 --
CREATE TABLE permission_role (
rid int(11) NOT NULL ,
pid int(11) NOT NULL ,
KEY idx_rid (rid),
KEY idx_pid (pid)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
INSERT INTO permission_role VALUES ('1', '1');
INSERT INTO permission_role VALUES ('1', '2');
INSERT INTO permission_role VALUES ('1', '3');
INSERT INTO permission_role VALUES ('1', '4');
INSERT INTO permission_role VALUES ('2', '1');
INSERT INTO permission_role VALUES ('2', '4');
-- 用户角色关系表 --
CREATE TABLE user_role (
uid int(11) NOT NULL ,
rid int(11) NOT NULL ,
KEY idx_uid (uid),
KEY idx_rid (rid)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
INSERT INTO user_role VALUES (1, 1);
INSERT INTO user_role VALUES (2, 2);
Mapper的配置
1、UserMapper
根据用户名去数据库查找实体
public interface
UserMapper {
User
findByUsername
(
@Param
(
"username"
) String username)
;
}
2、service配置存在如下关系
3、mapper.xml
mapper中配置好各个IO的对应情况
需要配置读取UserMapper.xml的路径
application中需要配置需要加载的mapper类路径
授权与鉴权
需要继承
import
org.apache.shiro.realm.AuthorizingRealm
; 实现当中的方法。
1、第一个方法为授权
2、第二个方法为登陆
1、授权:
核心思想:
- 获取当前用户信息
- 因为user存放的是set<Role>,所以用for循环取出内容
- 取出的role存放new 出来的List中
- 利用for循环取出permission放入new出来的List中
- 将刚才的list放入 new SimpleAuthorizationInfo() 中的role和permission中
- 返回该对象
@Override
protected
AuthorizationInfo
doGetAuthorizationInfo
(PrincipalCollection principals)
{
//
获取
User
用户
User user = (User) principals.fromRealm(
this
.getClass().getName()).iterator().next()
;
List<String> permissionList =
new
ArrayList<>()
;
List<String> roleNameLi