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