shiro-velocity整合

程举
2023-12-01

shiro的标签支持jsp。。。
这尼玛是不能容忍的。
然后网上找资料发现有一个哥们写了整合工具,然后使用了他的。。
忽然发现项目中的velocity与toolbox版本都比较低。
然后spring对velocity也是从1.3X开始的。
后来开始研究velocity-toolbox
发现都是写一个工具类
然后借鉴了之前的那个哥们的项目

得出以下结论

  1. 新建一个PermissionUtils 怎么判断权限呢,权限是由subject判断的,那么怎么取出subject呢。。。
  2. subject是与线程绑定的,那我们每一次请求一次服务器,怎么保证subject的唯一性呢,就是怎么确定他是我们需要的呢

通过研究shiro的源码发现,因为http是无状态的,在一个请求开始之前,先进入shiro的Filter,然后shiro会读取当前请求附带的cookies,查询对应的生成的sessionid,然后寻找对应的session,其实和tomcat 的原理是一样的。然后会创建subject。绑定到当前线程之中。然后前的线程上下文对应的subject就是我们所需的subject。

我们就可以根据SecurityUtils.getSubject()获取即可
那哥们的源码位置

感觉他的代码不太优雅。。。
修改了一下==true和!=false这种代码 并且把所有方法改为了static的,这样在我们的代码中也可以直接使用了。但是建议能用注解的就用注解。。。



import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.util.Collection;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Velocity 模板引擎,Shiro 权限标签
 *
 * @author Yong.Teng <webmaster@buession.com>
 */
public class PermissionUtils {

    private static final String ROLE_NAMES_DELIMETER = ",";
    private static final String PERMISSION_NAMES_DELIMETER = ",";

    private static final Logger logger = LoggerFactory.getLogger(PermissionUtils.class);

    public static Subject getCurrentSubject(){
        return SecurityUtils.getSubject();
    }
    /**
     * 验证是否为已认证通过的用户,不包含已记住的用户,这是与 isUser 标签方法的区别所在。
     *
     * @return 用户是否已通过认证
     */
    public static boolean isAuthenticated() {
        Subject subject = getCurrentSubject();
        return subject != null && subject.isAuthenticated();
    }

    /**
     * 验证是否为未认证通过用户,与 isAuthenticated 标签相对应,与 isGuest 标签的区别是,该标签包含已记住用户。
     *
     * @return 用户是否未通过认证
     */
    public static boolean isNotAuthenticated() {
        Subject subject = getCurrentSubject();
        return subject == null || !subject.isAuthenticated();
    }

    /**
     * 验证用户是否为 <访客>,即未认证(包含未记住)的用户。
     *
     * @return 用户是否为 <访客>
     */
    public static boolean isGuest() {
        Subject subject = getCurrentSubject();
        return subject == null || subject.getPrincipal() == null;
    }

    /**
     * 验证用户是否认证通过或已记住的用户。
     *
     * @return 用户是否认证通过或已记住的用户
     */
    public static boolean isUser() {
        Subject subject = getCurrentSubject();
        return subject != null && subject.getPrincipal() != null;
    }

    /**
     * 返回用户 Principal。
     *
     * @return 用户 Principal
     */
    public static Object getPrincipal() {
        Subject subject = getCurrentSubject();
        return subject != null ? subject.getPrincipal() : null;
    }

    /**
     * 返回用户属性。
     *
     * @param property 属性名称
     * @return 用户属性
     */
    public static Object getPrincipalProperty(String property) {
        Subject subject = getCurrentSubject();

        if (subject != null) {
            Object principal = subject.getPrincipal();

            try {
                BeanInfo bi = Introspector.getBeanInfo(principal.getClass());

                for (PropertyDescriptor pd : bi.getPropertyDescriptors()) {
                    if (pd.getName().equals(property)) {
                        return pd.getReadMethod().invoke(principal, (Object[]) null);
                    }
                }

                logger.trace("Property [{}] not found in principal of type [{}]", property,
                        principal.getClass().getName());
            } catch (Exception e) {
                logger.trace("Error reading property [{}] from principal of type [{}]", property,
                        principal.getClass().getName());
            }
        }

        return null;
    }

    /**
     * 验证用户是否具备某角色。
     *
     * @param role 角色名称
     * @return 用户是否具备某角色
     */
    public static boolean hasRole(String role) {
        Subject subject = getCurrentSubject();
        return subject != null && subject.hasRole(role);
    }

    /**
     * 验证用户是否不具备某角色,与 hasRole 逻辑相反。
     *
     * @param role 角色名称
     * @return 用户是否不具备某角色
     */
    public static boolean lacksRole(String role) {
        return !hasRole(role);
    }

    /**
     * 验证用户是否具有以下任意一个角色。
     *
     * @param roleNames 以 delimeter 为分隔符的角色列表
     * @param delimeter 角色列表分隔符
     * @return 用户是否具有以下任意一个角色
     */
    private static boolean hasAnyRoles(String roleNames, String delimeter) {
        Subject subject = getCurrentSubject();
        if (subject != null) {
            if (delimeter == null || delimeter.length() == 0) {
                delimeter = ROLE_NAMES_DELIMETER;
            }

            for (String role : roleNames.split(delimeter)) {
                if (subject.hasRole(role.trim())) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * 验证用户是否具有以下任意一个角色。
     *
     * @param roleNames 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表
     * @return 用户是否具有以下任意一个角色
     */
    public static boolean hasAnyRoles(String roleNames) {
        return hasAnyRoles(roleNames, ROLE_NAMES_DELIMETER);
    }

    /**
     * 验证用户是否具有以下任意一个角色。
     *
     * @param roleNames 角色列表
     * @return 用户是否具有以下任意一个角色
     */
    public static boolean hasAnyRoles(Collection<String> roleNames) {
        Subject subject = getCurrentSubject();

        if (subject != null && roleNames != null) {
            for (String role : roleNames) {
                if (role != null && subject.hasRole(role.trim())) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * 验证用户是否具有以下任意一个角色。
     *
     * @param roleNames 角色列表
     * @return 用户是否具有以下任意一个角色
     */
    public static boolean hasAnyRoles(String[] roleNames) {
        Subject subject = getCurrentSubject();

        if (subject != null && roleNames != null) {
            for (String role : roleNames) {
                if (role != null && subject.hasRole(role.trim())) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * 验证用户是否具备某权限。
     *
     * @param permission 权限名称
     * @return 用户是否具备某权限
     */
    public static boolean hasPermission(String permission) {
        Subject subject = getCurrentSubject();
        return subject != null && subject.isPermitted(permission);
    }

    /**
     * 验证用户是否不具备某权限,与 hasPermission 逻辑相反。
     *
     * @param permission 权限名称
     * @return 用户是否不具备某权限
     */
    public static boolean lacksPermission(String permission) {
        return !hasPermission(permission);
    }

    /**
     * 验证用户是否具有以下任意一个权限。
     *
     * @param permissions 以 delimeter 为分隔符的权限列表
     * @param delimeter   权限列表分隔符
     * @return 用户是否具有以下任意一个权限
     */
    private static boolean hasAnyPermissions(String permissions, String delimeter) {
        Subject subject = getCurrentSubject();

        if (subject != null) {
            if (delimeter == null || delimeter.length() == 0) {
                delimeter = PERMISSION_NAMES_DELIMETER;
            }

            for (String permission : permissions.split(delimeter)) {
                if (permission != null && subject.isPermitted(permission.trim())) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * 验证用户是否具有以下任意一个权限。
     *
     * @param permissions 以 PERMISSION_NAMES_DELIMETER 为分隔符的权限列表
     * @return 用户是否具有以下任意一个权限
     */
    public static boolean hasAnyPermissions(String permissions) {
        return hasAnyPermissions(permissions, PERMISSION_NAMES_DELIMETER);
    }

    /**
     * 验证用户是否具有以下任意一个权限。
     *
     * @param permissions 权限列表
     * @return 用户是否具有以下任意一个权限
     */
    public static boolean hasAnyPermissions(Collection<String> permissions) {
        Subject subject = getCurrentSubject();

        if (subject != null && permissions != null) {
            for (String permission : permissions) {
                if (permission != null && subject.isPermitted(permission.trim())) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * 验证用户是否具有以下任意一个权限。
     *
     * @param permissions 权限列表
     * @return 用户是否具有以下任意一个权限
     */
    public static boolean hasAnyPermissions(String[] permissions) {
        Subject subject = getCurrentSubject();

        if (subject != null && permissions != null) {
            for (String permission : permissions) {
                if (permission != null && subject.isPermitted(permission.trim())) {
                    return true;
                }
            }
        }

        return false;
    }

}
 类似资料: