圣杯 3;通过 Spring 安全查看您自己的数据

grails 3; Seeing your own data with Spring Security

Grails:3.3.0 Spring 安全性:3.2.0.M1

我对此做了一些研究,我发现来自 (Seeing only your own data in Grails) post 的答案可能是我正在寻找的答案,但不知何故它不起作用。

这就是我捕获登录用户并尝试过滤掉的方式,只让登录用户查看他自己的数据。 (这是我的任务控制器) 顺便问下[tasks:tasks]有什么用

def index(Integer max) {

    def authenticated = getAuthenticatedUser().username
    def tasks = User.findAllByUsername(authenticated)
    [tasks: tasks]
    params.max = Math.min(max ?: 10, 100)
    respond Task.list(params), model:[tasks: Task.count()]
}

这是我的任务域

class Task {

    transient springSecurityService
    
    String task
    Project project
    Pic picName
   
    static hasMany = [subTask:Subtask]
    static belongsTo =[Project,Pic,User]
    }
    

请给我一些建议或者让我知道我哪里错了! 提前致谢! 最好的问候,熙

我认为您的要求与 Spring 安全无关。

关于 "By the way what is the use of [tasks:tasks]" - 看起来你在代码中有两个 return 点,所以你需要修复它 - 在 groovy 中你可以省略 "return"如果你在最后一行 - 所以我假设这一行是包含任务列表的模型的 return - 但代码在它之后继续......

  1. 如果任何任务属于用户,那么您应该使用:

    User user = getAuthenticatedUser() // method for getting the curren user
    params.max = Math.min(max ?: 10, 100) // any query params you want to add
    def tasks = Task.findAllByUser(user, params) //get the user Tasks using the query params
    

然后 return 数据 + 任何其他数据,如计数等

  1. 你可以考虑不使用多个 belongsTo 它会使你的模型过于复杂而不需要:

    static belongsTo =[Project,Pic,User]
    

    在任务属于用户的情况下,您可以为每个任务保留用户 ID 或用户名,然后通过此查询 属性 - 例如:

    class Task {
    
    transient springSecurityService 
    
    String username  // not unique
    String task
    Project project
    Pic picName
    
    static hasMany = [subTask:Subtask]
    static belongsTo =[Project,Pic]
    }
    
    def username = getAuthenticatedUser().username // method for getting the current username.
    params.max = Math.min(max ?: 10, 100) // any query params you want to add.
    def tasks = Task.findAllByUsername(username, params) get the user Tasks using the query params.
    
  2. 顺便说一句,在域模型中保留服务不是一个好的做法 - 通过将服务注入到您的控制器/服务中来使用该服务

    transient springSecurityService
    

我已经通过在 gsp 呼叫 "tasks" 完成了。它对我有用

 def     authenticated = getAuthenticatedUser().username
        
        def     tasks = Task.findAllByLogginUser(authenticated)
        
        params.max = Math.min(max ?: 10, 100)
        respond Task.list(params), model:[tasks:tasks] // [tasks:tasks] is to passing tasks into my domain

然后我就从我的域中调用 class ${tasks}