Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 检查权限;总是对数据库发出请求吗?_Performance_Jsf_Shiro - Fatal编程技术网

Performance 检查权限;总是对数据库发出请求吗?

Performance 检查权限;总是对数据库发出请求吗?,performance,jsf,shiro,Performance,Jsf,Shiro,我有一个关于ApacheShiro的问题。 我使用权限和角色概念 我在左侧有一个菜单,其中有许多指向其他页面的链接(创建员工、显示员工列表等)。 对于每个菜单项,我还为其提供了隐藏或不隐藏的安全性(取决于权限),如: 我建议您使用Shiro的过滤器来处理实际的登录逻辑。 否则,您最终可能会发现主题与会话无关。看起来您的应用程序可能会在调用getCurrentUserShiro时强制登录。您应该让框架为您处理这个问题 它不是JSF,但您可以在这里看到一个基本的JSP示例(Shrio配置逻辑将是相

我有一个关于ApacheShiro的问题。 我使用权限和角色概念

我在左侧有一个菜单,其中有许多指向其他页面的链接(创建员工、显示员工列表等)。 对于每个菜单项,我还为其提供了隐藏或不隐藏的安全性(取决于权限),如:


我建议您使用Shiro的过滤器来处理实际的登录逻辑。

否则,您最终可能会发现主题与会话无关。看起来您的应用程序可能会在调用
getCurrentUserShiro
时强制登录。您应该让框架为您处理这个问题

它不是JSF,但您可以在这里看到一个基本的JSP示例(Shrio配置逻辑将是相同的):


您可能只需要替换登录页面:使用自定义页面

我建议使用Shiro的过滤器为您处理实际的登录逻辑。

否则,您最终可能会发现主题与会话无关。看起来您的应用程序可能会在调用
getCurrentUserShiro
时强制登录。您应该让框架为您处理这个问题

它不是JSF,但您可以在这里看到一个基本的JSP示例(Shrio配置逻辑将是相同的):



您可能只需将登录页面替换为自定义页面

“ApacheShiro是否为每个菜单项执行”-这严格取决于
getCurrentUserShiro()
的实现。“如果是:如何改进?”-使用缓存。更改标题:@Selaron是对的,这个编程问题也会在单元测试中出现…我已经更新了代码。。。我的bean是@sessionscope。。。。你指的是什么样的缓存?从primefaces缓存?还是在Shiro?我应该使用哪个缓存提供程序?…或在会话范围bean的列表/映射中缓存。。。但是,是的,p:cache可能也有帮助(如果您对每个用户进行缓存),关于“如果用户被允许或不允许,ApacheShiro是否对每个菜单项执行对数据库的请求?或者Shiro是否在登录时获取用户的所有权限并将其“保留”在“Shiro用户”对象中?”阅读Shiro手册或设置一些断点或调试日志。。。“ApacheShiro是否为每个菜单项执行”-这严格取决于
getCurrentUserShiro()
的实现。如果是,我如何改进它?“-Use caching.changed title:@Selaron是对的,这个编程问题也会在单元测试中显示出来……我已经更新了代码。。。我的bean是@sessionscope。。。。你指的是什么样的缓存?从primefaces缓存?还是在Shiro?我应该使用哪个缓存提供程序?…或在会话范围bean的列表/映射中缓存。。。但是,是的,p:cache可能也有帮助(如果您对每个用户进行缓存),关于“如果用户被允许或不允许,ApacheShiro是否对每个菜单项执行对数据库的请求?或者Shiro是否在登录时获取用户的所有权限并将其“保留”在“Shiro user”对象中?”阅读shiro手册或设置一些断点或调试日志…我不知道你的意思。。。。我的项目中已经有shiro.ini了?我还有一个登录页面。否则用户不会登录…对,但是您仍然直接管理身份验证部分,我建议您让Shiro来处理,而不是手动调用subject.login(),我不确定您的意思。如果不调用subject.login,我如何处理它?我需要一个jsf页面中的按钮,这也是调用subject.login?让您的应用程序没有任何身份验证授权自定义代码。现在添加shiro.ini并在web.xml中输入shiro环境侦听器。让Shiro为您编写所有身份验证代码。@MarcMeister,看看我给您指出的示例代码。只要发布到相同的表单,您的用户就会登录。我不确定您的意思。。。。我的项目中已经有shiro.ini了?我还有一个登录页面。否则用户不会登录…对,但是您仍然直接管理身份验证部分,我建议您让Shiro来处理,而不是手动调用subject.login(),我不确定您的意思。如果不调用subject.login,我如何处理它?我需要一个jsf页面中的按钮,这也是调用subject.login?让您的应用程序没有任何身份验证授权自定义代码。现在添加shiro.ini并在web.xml中输入shiro环境侦听器。让Shiro为您编写所有身份验证代码。@MarcMeister,看看我给您指出的示例代码。只要发布到相同的表单,您的用户就会登录。
<pm:menu widgetVar="me"
rendered="#{checkPermissionController.checkPermission(['myprofile:show', 'myprofile:edit'])}">
/**
     * Check permission for login User
     * 
     * @return
     * @throws IOException
     * @throws PermissionGroupNotFoundException
     */
    public boolean checkPermission(String permissionName) throws IOException {

        if (loginBean.getCurrentUserShiro().isPermitted(permissionName)) {
            return true;
        }

        return false;
    }

    /**
     * If one of the permission is true
     * 
     * @param strings
     * @return
     */
    public boolean checkPermission(List<String> list) {

        int i = list.size();

        if (i != 0) {
            for (String s : list) {
                if (loginBean.getCurrentUserShiro().isPermitted(s)) {
                    return true;
                }
            }
        }

        return false;
    }
@SessionScoped
@Named
public class LoginBean implements Serializable {

private Subject currentUserShiro;

public String submit() {

        LOGGER.info("START submit");

        try {

            currentUserShiro = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
....
}

    ////////////////////
    // Getter + Setter
    ////////////////////
    public String getUsername() {
        return username;
    }

    public Subject getCurrentUserShiro() {
        return currentUserShiro;
    }
            currentUserShiro.login(token);