Java安全框架——Apache Shiro(二十二)

57 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

【3.4】ShiroUser
  
package com.itheima.shiro.core.base;  
  
import com.itheima.shiro.utils.ToString;  
import lombok.Data;  
  
import java.util.List;  
  
  
/**  
 * @Description 自定义Authentication对象,使得Subject除了携带用户的登录名外还可以携带更多信息  
 */  
@Data  
public class  ShiroUser extends ToString {  
  
    /** serialVersionUID */  
    private static final long serialVersionUID = -5024855628064590607L;  
  
    /**  
     * 主键  
     */  
    private String id;  
  
    /**  
     * 登录名称  
     */  
    private String loginName;  
  
    /**  
     * 真实姓名  
     */  
    private String realName;  
  
    /**  
     * 昵称  
     */  
    private String nickName;  
  
    /**  
     * 密码  
     */  
    private String passWord;  
  
    /**  
     * 加密因子  
     */  
    private String salt;  
  
    /**  
     * 性别  
     */  
    private Integer sex;  
  
    /**  
     * 邮箱  
     */  
    private String zipcode;  
  
    /**  
     * 地址  
     */  
    private String address;  
  
    /**  
     * 固定电话  
     */  
    private String tel;  
  
    /**  
     * 电话  
     */  
    private String mobil;  
  
    /**  
     * 邮箱  
     */  
    private String email;  
  
    /**  
     * 职务  
     */  
    private String duties;  
  
    /**  
     * 排序  
     */  
    private Integer sortNo;  
  
    /**  
     * 是否有效  
     */  
    private String enableFlag;  
      
    private List<String> resourceIds;  
  
    public ShiroUser() {  
        super();  
    }  
  
    public ShiroUser(String id, String loginName) {  
        super();  
        this.id = id;  
        this.loginName = loginName;  
    }  
  
  
    @Override  
    public int hashCode() {  
        final int prime = 31;  
        int result = 1;  
        result = prime * result + ((email == null) ? 0 : email.hashCode());  
        result = prime * result + ((id == null) ? 0 : id.hashCode());  
        result = prime * result  
                + ((loginName == null) ? 0 : loginName.hashCode());  
        result = prime * result + ((mobil == null) ? 0 : mobil.hashCode());  
        return result;  
    }  
  
    @Override  
    public boolean equals(Object obj) {  
        if (this == obj)  
            return true;  
        if (obj == null)  
            return false;  
        if (getClass() != obj.getClass())  
            return false;  
        ShiroUser other = (ShiroUser) obj;  
        if (email == null) {  
            if (other.email != null)  
                return false;  
        } else if (!email.equals(other.email))  
            return false;  
        if (id == null) {  
            if (other.id != null)  
                return false;  
        } else if (!id.equals(other.id))  
            return false;  
        if (loginName == null) {  
            if (other.loginName != null)  
                return false;  
        } else if (!loginName.equals(other.loginName))  
            return false;  
        if (mobil == null) {  
            if (other.mobil != null)  
                return false;  
        } else if (!mobil.equals(other.mobil))  
            return false;  
        return true;  
    }  
      
      
}  
  
【3.5】UserBridgeService

package com.itheima.shiro.core.bridge;

import com.itheima.shiro.core.base.ShiroUser;
import com.itheima.shiro.pojo.User;
import org.apache.shiro.authz.AuthorizationInfo;

import java.util.List;

/**
* @Description:用户信息桥接(后期会做缓存)
*/
public interface UserBridgeService {

    /**
* @Description 查找用户信息
* @param loginName 用户名称
* @return user对象
*/
User findUserByLoginName(String loginName);

    /**
* @Description 鉴权方法
* @param shiroUser 令牌对象
* @return 鉴权信息
*/
AuthorizationInfo getAuthorizationInfo(ShiroUser shiroUser);

    /**
* @Description 查询用户对应角色标识list
* @param userId 用户id
* @return 角色标识集合
*/
List findRoleList(String userId);

    /**
* @Description 查询用户对应资源标识list
* @param userId 用户id
* @return 资源标识集合
*/
List findResourcesList(String userId);

    /**
* @Description 查询资源ids
* @param userId 用户id
* @return 资源id集合
*/
List findResourcesIds(String userId);
}

【3.6】UserBridgeServiceImpl

package com.itheima.shiro.core.bridge.impl;

import com.itheima.shiro.core.adapter.UserAdapter;
import com.itheima.shiro.core.base.ShiroUser;
import com.itheima.shiro.core.bridge.UserBridgeService;
import com.itheima.shiro.pojo.Resource;
import com.itheima.shiro.pojo.Role;
import com.itheima.shiro.pojo.User;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
* @Description:用户信息桥接(后期会做缓存)
*/
@Component("userBridgeService")
public class UserBridgeServiceImpl implements UserBridgeService {

    @Autowired
UserAdapter userAdapter;

    @Override
public User findUserByLoginName(String loginName) {

        return userAdapter.findUserByLoginName(loginName);
}

    @Override
public AuthorizationInfo getAuthorizationInfo(ShiroUser shiroUser) {
//查询用户对应的角色标识
List roleList = this.findRoleList(shiroUser.getId());
//查询用户对于的资源标识
List resourcesList = this.findResourcesList(shiroUser.getId());
//构建鉴权信息对象
SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
simpleAuthorizationInfo.addRoles(roleList);
simpleAuthorizationInfo.addStringPermissions(resourcesList);
return simpleAuthorizationInfo;
}

    @Override
public List findRoleList(String userId){
List roles = userAdapter.findRoleByUserId(userId);
List roleLabel = new ArrayList<>();
for (Role role : roles) {
roleLabel.add(role.getLabel());
}
return roleLabel;
}

    @Override
public List findResourcesList(String userId){
List resources = userAdapter.findResourceByUserId(userId);
List resourceLabel = new ArrayList<>();
for (Resource resource : resources) {
resourceLabel.add(resource.getLabel());
}
return resourceLabel;
}

    @Override
public List findResourcesIds(String userId) {
List resources = userAdapter.findResourceByUserId(userId);
List ids = new ArrayList<>();
for (Resource resource : resources) {
ids.add(resource.getId());
}
return ids;
}

}