身份验证 从Grails中的过滤器定义控制器可访问变量

更新时间:2024-01-29 下载TXT文档 下载Word文档

我正在用Grails编写一个小型Web应用程序,并确保所有用户都已通过身份验证,我正在使用以下过滤器:

class LoginFilters {
  static filters = {
    loginCheck(controller:'*', action:'*') {
      before = {
        if (session.user_id) {
          request.user = User.get(session.user_id)
        } else if (!actionName.equals("login")) {
          redirect(controller:"login", action:"login")
          return false
        }
      }
    }
  }
}

所有控制器方法均始于读取请求对象的用户属性:

def actionName = {
   def user = request.user
   ...
}

上面的代码可以工作,但是我宁愿避免所有控制器方法中的重复代码。过滤器是否可以将用户对象绑定到名为" user "而不是" request.user "的变量,所有控制器都可以访问该变量?

我了解可能存在范围界定问题,因此无法做到这一点,但是Grails框架似乎能够在幕后创造出一定的魔力,因此我认为这值得一提。

我认为通常每次将用户对象插入请求对象通常不是一个好主意:

请求的生命周期很短,因此您可能最终会在每次http请求中检索高速缓存,甚至更糟地访问数据库,以获取对象,而您甚至可能不需要该对象,并且该对象随后会被删除。因此,如果必须的话,最好将整个对象而不是id存储在会话中。

通常,我建议您编写一个AuthenticationService,其中的方法isLoggedIn()在对用户进行身份验证时返回true,而方法getLoggedInUser()返回此对象。 {短码网-DuanMa.NET}

class AuthenticationService {
    def transactional = false
    boolean isLoggedIn() { return session.user_id }
    def getLoggedInUser() { return User.get(session.user_id) }
}

然后,如果未通过身份验证,则可以使用筛选器进行重定向,也可以使用拦截器来存储本地引用user = authenticationService.loggedInUser。但是我也不认为这是最好的方法。我建议您为src / groovy中的所有控制器创建一个抽象的AuthenticationAwareController作为基类,并且有方便的方法,例如user

class AuthenticationAwareController {
    def authenticationService
    def getUser() { return authenticationService.loggedInUser() }
}

这样,您以后可以改变主意,以自己喜欢的方式存储用户,而不必更改代码。您还可以从Hibernate中的缓存中受益,这些缓存在不同的会话之间共享已检索到的用户对象实例,因此避免了数据库往返。

您仍然应该检查检索到的用户对象的有效性,或者抛出AuthenticationException,以防检索失败。 (也许像AuthenticationService.getLoggedInUser(failOnError = false)之类的。)

您甚至可以将此Service / ControllerBase做成一个小插件,以在每个应用程序上重用,或者直接与spring安全插件一起使用...;-)

在控制器中使用beforeInterceptor可能会有所帮助:

class LoginController {

    def user

    def beforeInterceptor = {
        user = request.user
    }

    def index = { 
        render text:"index: ${user}"        
    }

    def test = {
        render text:"test: ${user}"         
    }
}

我认为您可以这样做,但真的值得您为此烦恼吗?在我看来,您的唯一优势是键入" user"而不是" request.user"。没有太大的收获。无论如何,我认为您可以按照《用户指南》中的" 12.7在运行时添加动态方法"中的说明进行操作。我认为,如果您创建了一个动态方法" getUser(){return request.user}",那么Groovy JavaBeans的getter / setter访问将允许您简单地以所需的方式引用" user"。

如果您确实添加了动态方法,则可能要跳过过滤器,并在动态方法中全部完成操作。

以上就是短码网小编为大家整理的《身份验证 从Grails中的过滤器定义控制器可访问变量》相关内容,希望大家喜欢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若内容造成侵权/违法违规/事实不符,请将联系本站反馈,一经查实,立即处理!

身份验证 从Grails中的过滤器定义控制器可访问变量》文档下载仅供参考学习,下载后请在24小时内删除。

转载注明出处:https://www.duanma.net/article/db087508547.html

回到顶部