spring boot 前后端分离整合shiro(二)自定义realm
想使用shiro我们需要自定义一个realm,先看看shiro relam的继承关系
我们关注两个类,一个是AuthenticatingRealm,用来认证;一个是AuthorizingRealm,用来授权。然后AuthorizingRealm又继承了AuthenticatingRealm,所以我们只要继承AuthorizingRealm就既有授权又有认证了。
继承之后需要实现两个方法,分别用于授权和认证(这两个方法名字很像,不要搞混了),然后就在这两个方法里写我们自己的认证授权。
修改实体类
用户拥有角色,角色拥有权限,而用户又可以直接拥有某个权限,所以给UserInfo添加两个list。顺便序列化,添加序列化id,之后继承redis、配置remenberMe需要。
UserInfo
package com.example.demo.entity;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class UserInfo implements Serializable {
private static final long serialVersionUID = -482049523211701500L;
private Integer userId;
private String userName;
private String loginName;
private String password;
private Integer gender;
private List<Role> roleList;
private List<Permission> permissionList;
}
Role
package com.example.demo.entity;
import java.util.List;
public class Role {
private Integer roleId;
private String roleName;
private String description;
private List<Permission> permissionList;
}
编写UserInfoService
public interface UserInfoService {
/**
* 查询用户的基本信息,不包括角色、权限信息
* @param loginName
* @return
*/
UserInfo findUserInfoByLoginName(String loginName);
/**
* 查询用户的信息,包括角色、权限信息
* @param userInfo
* @return
*/
UserInfo findUserAllInfoByUserId(UserInfo userInfo);
}
impl
public class UserInfoServiceImpl implements UserInfoService {
@Autowired
private UserInfoMapper userInfoMapper;
@Autowired
private RoleMapper roleMapper;
@Autowired
private PermissionMapper permissionMapper;
@Override
public UserInfo findUserInfoByLoginName(String loginName) {
return userInfoMapper.selectUserInfoByLoginName(loginName);
}
@Override
public UserInfo findUserAllInfoByUserId(UserInfo userInfo) {
userInfo.setRoleList(roleMapper.selectRolesByUserId(userInfo.getUserId()));
userInfo.setPermissionList(permissionMapper.<