如何检测shiro是不是允许uri或从uri中提取控制器名称
Posted
技术标签:
【中文标题】如何检测shiro是不是允许uri或从uri中提取控制器名称【英文标题】:how to detect whether a uri is allow by shiro or extract controller name from uri如何检测shiro是否允许uri或从uri中提取控制器名称 【发布时间】:2011-05-23 20:43:17 【问题描述】:我有一个 uri,例如 someController/someAction?param1=aa¶m2=bb
是否有一些 grails 方法可以从这个 uri 中提取控制器名称和动作名称。
或者shiro有什么方法可以检测这个uri是允许的吗?
我有一个域 Menu(name,url),现在想获取当前用户允许的菜单列表。
url 比如/auth/login(可能映射为user:login), /user/login
所以两天前我问了这个问题。
现在我将菜单更改为(名称、控制器、操作、参数),并像这样过滤菜单列表:
def subject = SecurityUtils.subject;
menuList.each
if(it.permission)
def perm = shiroPermissionResolver.resolvePermission("$it.permission.controller:$it.permission.action")
def isPermitted = subject.isPermitted(perm)
println "$isPermitted -> $it.permission.controller:$it.permission.action"
对不起,我的英语不好,谢谢你的回复。
顺便说一句,这是另一个关于如何缓存 shiro 的问题: how to use cache permissions in grails shiro
泛滥: 那么你认为存储菜单列表的更好方法是什么? 原因:
-
由于用户的权限,它需要向用户显示不同的菜单。
有时我们更新了一个 web 应用程序,但想稍后向用户显示菜单。
所以我们只需要改变比如一个menu.visible。 (比更改硬代码 cfg 或源代码更好)。
我们正在使用 extjs 来显示菜单(所以导航插件无法使用)。
【问题讨论】:
对不起,我无法回答这个问题,你能给我举个例子吗? 我只是认为如果我有一个 url,如何将其更改为控制器 + 动作。也许 /auth/login 正在映射到 user:login 您能帮我理解您为什么将用户界面菜单存储在域类中吗? 【参考方案1】:Shiro 使用$controller:$action
的约定来获取权限。你有两个选择:
-
使用 Shiro 标签
直接使用 Shiro API
在第一种情况下,您可以在 GSP 中添加如下内容:
<shiro:hasPermission permission="someController:someAction">
<g:link...>
</shiro:hasPermission>
<shiro:lacksPermission permission="someController:someAction">
No link
</shiro:lacksPermission>
或者,您可以使用 <g:if...>
标记并使用
SecurityUtils.subject.isPermitted("someController:someAction")
直接检查用户是否具有必要权限的方法。
如需了解更多信息,请查看Grails Shiro Tag Library Source 和Shiro API docs。
【讨论】:
感谢您的回复。我只是认为,如果我有一个 url,如何将其更改为控制器 + 动作。也许 /auth/login 正在映射到 user:login 您需要在应用程序的哪个位置进行此项检查?我用过 Shiro 和 Grails 很多次,如果你最终遇到这种情况,可能是因为你没有充分利用 Shiro 和/或 Grails 提供的功能。如果您可以发布更多详细信息,我可能可以帮助您找出问题所在。将一段代码发布到您要进行此测试的地方,我们将从那里开始......以上是关于如何检测shiro是不是允许uri或从uri中提取控制器名称的主要内容,如果未能解决你的问题,请参考以下文章
检测浏览器是不是支持带有 iframe 的数据 uri 方案
如何在 nodejs/javascript 中解析 Azure Blob URI?
如何在 Web 应用程序中检测 tel: uri 方案的可用性?