5

私はGrailsの初心者です。認証目的でSpring Security Grailsプラグインを使用しています。ビュー gsp ファイルで現在のユーザーを取得したい。

私はこのようにしようとしています...

<g:if test="${post.author == Person.get(springSecurityService.principal.id).id }">
      <g:link controller="post" action="edit" id="${post.id}">
            Edit this post
      </g:link>
</g:if>

ここでは、signed_in ユーザーが作成した投稿のみに [この投稿を編集] リンクを表示したいと思います。しかし、それはエラーを示しています -

Error 500: Internal Server Error

 URI
    /groovypublish/post/list
 Class
   java.lang.NullPointerException
 Message
   Cannot get property 'principal' on null object

ここに私の Post.groovy があります --

class Post {

static hasMany = [comments:Comment]

String title
String teaser
String content
Date lastUpdated
Boolean published = false
SortedSet comments
Person author

....... more code ....

これが私の Person.groovy ドメインクラスファイルです --

class Person {

transient springSecurityService

String realName
String username
String password
boolean enabled
boolean accountExpired
boolean accountLocked
boolean passwordExpired
byte[] avatar
String avatarType

static hasMany = [followed:Person, posts:Post]
static searchable = [only: 'realName']
    ........ more code ......

助けてください。

4

4 に答える 4

15

Spring Security Taglibsを使用できます。やりたいことについては、ログインしているユーザーが投稿の所有者であるかどうかを確認してください。次のことができます。

<sec:isLoggedIn>
<g:if test="${post.author.id == sec.loggedInUserInfo(field: 'id')}">
      <g:link controller="post" action="edit" id="${post.id}">
            Edit this post
      </g:link>
</g:if>
</sec:isLoggedIn>

このチェックを頻繁に行う必要がある場合は、カスタム taglib に入れることをお勧めします。

class AuthTagLib {

  def springSecurityService

  def isOwner = { attrs, body ->
    def loggedInUser = springSecurityService.currentUser
    def owner = attrs?.owner

    if(loggedInUser?.id == owner?.id) {
      out << body()
    }
  }
}

次に、そのように使用します

<g:isOwner owner="${post?.author}">
  <g:link controller="post" action="edit" id="${post.id}">
    Edit this post
  </g:link>
</g:isOwner>
于 2013-07-08T12:34:43.033 に答える
0

もう 1 つの方法は、次のように、フィルターを作成し、ユーザーをフィルターの一部としてリクエスト スコープに配置することです。

class SetCurrentUserFilters {
    def springSecurityService
    def filters = {
        all(controller: '*', action: '*') {
            before = {
                if (springSecurityService.isLoggedIn()){
                    request.setAttribute("current_user", springSecurityService.currentUser);
                }
            }
            after = { Map model ->

            }
            afterView = { Exception e ->

            }
        }
    }
}

次に、GSP は次のように「current_user」属性を探す必要があります。

<g:if test="${current_user.property}"> ... </g:if>
于 2015-10-21T18:12:39.923 に答える
0

Spring Security プラグインの一部である既存のタグでは不十分なようですね。ドキュメントを見る

私のアドバイスは、Person エンティティに新しいメソッドを追加することです。これは、Post を引数として取り、編集できる場合は true/false を返します (または、逆に、Person を引数として取る Post エンティティに新しいメソッドを追加します)。あなたの判断次第です)。

次に、この方法を利用する独自のタグを作成すると、必須の手順ではありませんが、GPS がより便利になります。

于 2013-07-08T12:34:33.593 に答える