Grails Shiro LDAP用户/角色身份验证:如何/如何捕获和存储以供重用

问题描述 投票:0回答:1

所以我需要一些关于项目布局/结构的帮助。我正在创建一个网站,到目前为止,我有一个工作登录页面,它使用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和Grails 2的权威指南等大量书籍来帮助他们,但他们的大多数例子与我想做的事情不符。如果有任何我没有找到的教程,我有兴趣看到它们。 (我看了很多,但他们只是像我列出的那样有代码片段,但是没有指明它们实际去哪里!)

grails shiro user-roles ggts
1个回答
0
投票

我做了类似的事情:

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

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

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

这些可以帮助您为您的需求提供更好的设计:

how to implement Shiro Security of Grails in my Project

Secure some, but not all pages in a Grails application with the Shiro plugin

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:how to detect whether a uri is allow by shiro or extract controller name from uri进一步的前端检查

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.