使用 Grails Spring Security Plugin Core 和 REST 从用户响应中省略密码字段

Posted

技术标签:

【中文标题】使用 Grails Spring Security Plugin Core 和 REST 从用户响应中省略密码字段【英文标题】:Omit password field from User response using Grails Spring Security Plugin Core & REST 【发布时间】:2017-06-10 00:50:28 【问题描述】:

我正在使用 Grails 3.2.4 和 Grails Spring Security Plugin Core & REST。当向 User#index 发出请求时,我使用

params.max = Math.min(max ?: 10, 100)
respond User.list(params), model: [userCount: User.count()]

响应类似于:

[
  
    "id": 3,
    "accountExpired": false,
    "accountLocked": false,
    "enabled": true,
    "password": "$2a$10$fdWi7i48Kw5tnpzsjKMUMOQDx7nhglp9tRtDaJHTAi5qOTdIL0t3u",
    "passwordExpired": false,
    "username": "me"
  ,
  
    "id": 4,
    "accountExpired": false,
    "accountLocked": false,
    "enabled": true,
    "password": "$2a$10$3uFrDjJ8AwMsdMbKhExece6cJtQ4DS2e1/jFMIdDHrmqgDGpBgkS2",
    "passwordExpired": false,
    "username": "master"
  ,
  // ...

例如,如何自定义此响应并消除密码字段?

【问题讨论】:

【参考方案1】:

有几种方法可以实现这一点,但最简单的方法是在resources.groovy 中注册一个JsonRenderer 类型的bean,如下所示:

import grails.rest.render.json.JsonRenderer

beans = 
    userRenderer(JsonRenderer, User) 
        excludes = ['password']
    

更多方法请参考https://docs.grails.org/latest/guide/webServices.html#renderers。

【讨论】:

【参考方案2】:

如果您在项目中使用 JSON-VIEWS 功能并且您的控制器继承自 RestfulController,您还可以执行以下操作:

注意:我假设您的用户类名为 User

首先尝试使用命令

grails generate-views [yourpackage.]security.User

其中 [yourpackage.] 是可选的,表示您在执行 s2-quickstart 命令时创建用户类的包的名称。

如果视图生成成功,您会在 \grails-app\views 中找到一个名为 user 的目录,其中包含以下文件

_user.gson index.gson show.gson

这些应该是您的用户的 json 视图。打开 _user.gson。它应该有如下内容

import [yourpackage.]security.User

model 
    User user


json g.render(user)

编辑代码,使其从 json 渲染中排除密码

import [yourpackage.]security.Usuario

model 
    User user


json g.render(user, [excludes: ['password']) //This is where you exclude password

这似乎比编辑 bean 稍微复杂一些,但在我看来,寻找相关视图可能比查看 resources.groovy 更容易,如果其他人想要编辑项目。

有关此检查的更多信息,请查看grails reference to json views

【讨论】:

以上是关于使用 Grails Spring Security Plugin Core 和 REST 从用户响应中省略密码字段的主要内容,如果未能解决你的问题,请参考以下文章

Grails - grails-spring-security-rest - 无法从 application.yml 加载 jwt 机密

使用 Spring Security Grails 插件编码密码

Grails + spring-security-core:用户登录后如何分配角色?

在 Grails 中使用 Pre/Post Spring-Security Annotations

Grails 3.0 和 Spring Security

Grails - 卸载 Spring Security Core