【发布时间】:2019-12-25 07:39:10
【问题描述】:
我有一个关于 Apache Shiro 的问题。 我正在使用权限和角色概念。
我在左侧有一个菜单,其中包含许多指向我的其他页面的链接(创建员工、显示员工列表等)。 对于每个菜单项,我还可以安全地隐藏它(取决于权限),例如:
<pm:menu widgetVar="me"
rendered="#{checkPermissionController.checkPermission(['myprofile:show', 'myprofile:edit'])}">
为了检查用户是否被允许,我的 bean 中有这两个函数:
/**
* 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;
}
我现在的问题更多是针对性能。 如果用户被允许或不允许,Apache Shiro 是否为每个菜单条目执行对数据库的请求? 还是 Shiro 在登录时获取用户的所有权限并将其“持有”在“Shiro 用户”对象中?
如果是:我该如何改进?
编辑: 这是我的 LoginBean:
@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);
【问题讨论】:
-
"Apache Shiro 是否为每个菜单项执行" - 这完全取决于
getCurrentUserShiro()的实现。 “如果是:我该如何改进它?” - 使用缓存。 -
@Selaron 是对的,这个编程问题也会出现在单元测试中......
-
我已经更新了代码...我的 bean 是 @SessionScoped....你的意思是什么类型的缓存? p:来自primefaces的缓存?还是在 Shiro 中缓存?我应该使用哪个缓存提供程序?...
-
或缓存在会话范围 bean 中的列表/映射中...但是是的,p:cache 也可能有帮助(如果您按用户缓存)并且关于 " Apache Shiro 是否为每个执行如果用户被允许,菜单项对数据库的请求?还是 Shiro 在登录时获取用户的所有权限并将其“保留”在“Shiro 用户”对象中?” 阅读 shiro 手册或设置一些断点或调试日志...
标签: performance jsf shiro