0

所以我需要一些关于我的项目布局/结构的帮助。我正在制作一个网站,到目前为止,我有一个有效的登录页面,该页面使用 Apache Shiro 针对 LDAP 服务器对用户进行身份验证,并将用户重定向到启动页面。根据用户拥有的权限,他们应该/不应该能够查看启动页面上的某些内容。

我想做的是从会话信息(即刚刚登录的用户)中创建一个新的 ShiroUser 并为他们分配一些角色。例如,

def shiroUser = new ShiroUser()
shiroUser.username = session.username
shiroUser.addToRoles(ShiroRole.findByName('ROLE_USER'))
shiroUser.save()

并且ROLE_USER将由

def shiroRole = new ShiroRole()
shiroRole.name='ROLE_USER'
shiroRole.save()

现在我只对硬编码感兴趣,然后对其进行调整以在表格中查找并根据该表格中的值分配角色。

我想知道的是

  • 我把这些东西放在哪里?
  • 我要为此创建一个新控制器吗?
  • 我在哪里定义 shiroRoles?
  • 这甚至聪明吗?(每次有人登录时创建一个新的 ShiroUser)

我以前从未建立过网站,所以我不确定我应该如何构建代码或将东西放在哪里。(顺便说一句,我正在使用 GGTS。)一些方向/建议将不胜感激!我正在使用许多书籍,如 Grails in Action、Making Java Groovy 和 The Definitive Guide to Grails 2 来提供帮助,但他们的大多数示例与我想做的不匹配。如果有任何我没有找到的教程,我有兴趣看到它们。(我已经看了很多,但他们只是有我列出的代码片段,但没有具体说明它们的实际去向!)

4

1 回答 1

0

我做了类似的事情:

https://github.com/vahidhedayati/kchat/blob/master/grails-app/domain/kchat/UserDetails.groovy

但就我而言,我在我的应用程序中创建了一个用户并存储了各种 LDAP 信息,后来我在 securityFilters 中使用了我自己的过滤检查,以确保他们的 LDAP 组或用户 ID 与我的内部通过/失败规则相匹配,该规则通过 securityFilters 提供了真/假访问权限给定的动作/控制器调用。

另外这个https://github.com/vahidhedayati/customshiro可能是对上述实现的更好解释。

这些可以帮助您根据您的需求提出更好的设计:

如何在我的项目中实现 Grails 的 Shiro 安全性

使用 Shiro 插件保护 Grails 应用程序中的一些页面,但不是所有页面

http://coderberry.me/blog/2012/04/26/grails-authentication-with-shiro/

您应该使用 SecurityFilters(如上面的某些链接所示),即:

browseStore(controller:"store", action:"(show|list)") {
before  = {
  // Ignore direct views (e.g. the default main index page).
                if (!controllerName) return true

                // Access control by convention. 
                accessControl() 
}
}

或更繁琐地在控制器中匹配后端凭据

SecurityUtils.subject.isPermitted("someController:someAction")
or
if (SecurityUtils.subject.isPermitted("printer:query:lp7200")) {
    // Return the current jobs on printer lp7200
}

对于 gsp 中的进一步前端检查:如何检测 uri 是否被 shiro 允许或从 uri 中提取控制器名称

<shiro:hasPermission permission="someController:someAction">
     <g:link...>
</shiro:hasPermission>
<shiro:lacksPermission permission="someController:someAction">
     No link
</shiro:lacksPermission> 

E2A 在我的初始方法中,对给定控制器操作调用的用户/用户部门的控制 + 甚至对此应用程序环境和 appId 的内部进一步检查(这是传递的内部值)都是动态的,即使配置了 SecurityFilters 实际控制传递给我的自定义检查,该检查依赖于数据库条目进行验证。现在这是数据库意味着您可以更新或添加给定用户/部门用户组的权限,而无需更新后端控制器/安全过滤器。我必须把它放在要点上,否则它是值得回答的章节

https://gist.github.com/vahidhedayati/71d92f8153ade5d732b3

其他一些可能有帮助的东西:看看被捕插件。此处的演示站点包含 github.com/vahidhedayati/testingarrested 中插件的编译输出

于 2015-07-18T11:35:56.030 回答