2016-07-28 15 views
-1

Ich habe die Domain:Spring Security zu überprüfen, ob Benutzer hat Role

Benutzer hasOne Role hasMany Rolle

  • Exemples:

Role: Admin, Fachmann, Klient, ...

Rolle: ROLE_ACTION_1, ROLE_ACTION_2, ...

Wie ich überprüfen, ob ein Benutzer eine Role mit Anmerkung @Secured hat?

Ich muss überprüfen, ob der Benutzer alle Rollen von RoleGroup enthält?

Benutzerklasse:

class User implements Serializable { 

    private static final long serialVersionUID = 1 

    static constraints = { 
     password blank: false, password: true 
     username blank: false, unique: true 
    } 

    static mapping = { 
     password column: '`password`' 
     version false 
     table schema: "CA" 
    } 

    static transients = ['springSecurityService'] 

    transient springSecurityService 

    transient boolean enabled = true 
    transient boolean accountExpired 
    transient boolean accountLocked 
    transient boolean passwordExpired 

    String username 
    String password 
    RoleGroup profile 

    Set<RoleGroup> getAuthorities() { 
     [profile] 
    } 
} 

Role Klasse:

class RoleGroup implements Serializable { 

    private static final long serialVersionUID = 1 

    String name  

    Set<Role> getAuthorities() { 
     RoleGroupRole.findAllByRoleGroup (this)*.role 
    }  
} 
+0

Wollen Sie damit sagen, wenn Frühjahr eine Rollengruppe unterstützt, die eine Liste der Rollen ist nicht sicher, abt das?. Ich würde einen Datenbankentwurf für Rollen erstellen, die Rollen oder eine Rollengruppe erweitern, und sie dann im Frühjahr als Rolle behandeln. Spring unterstützt die Liste der Rollen -> @Secured ({"Admin", "Professional"}) – surya

+0

Fügen Sie Ihre Benutzerdomänenklassenquelle und die Beispielbenutzerklasseninstanz ein. –

+0

Ich füge meine Klassen ein –

Antwort

1

Ich glaube, Sie haben nicht vollständig Frühling Sicherheit ergriffen.

Bei der Verwendung von Annotation muss die Annotation zuerst in der Konfiguration aktiviert werden - dies ist standardmäßig der Fall.

Sie sichern dann entweder eine gesamte Steuerung oder einen Regler so etwas wie diese

@Secured(['ROLE_ADMIN', 'ROLE_USER']) 

mit es von der Arbeit aus keine Möglichkeit hat, alle von dem, was als Behörde Gruppen der Benutzer hat.

Obwohl in dem Code, den Sie in der Role Klasse eingefügt Sie haben:

getAuthorities() 

ich meine Benutzerdomäne Klasse gezwickt haben und addierten die folgenden:

Set<RoleGroup> getAuthorities() { 
     UserRoleGroup.findAllByUser(this)*.roleGroup 
    } 
    Set<RoleGroup> getAuthoritiesNames() { 
     UserRoleGroup.findAllByUser(this)*.roleGroup?.name 
    } 

Also, wenn ich einen Benutzer haben

dh Benutzer user = User.get (1L)

def authorities = user.getAuthorities() 
println "user ${user} has ${authorities}" 

, die eine Liste mit allen Behörden enthalten

if (authorities.contains('ROLE_USER')) { 
println "WOOHOO" 
} 

Mit Federsicherheits es wohnt auch in GSPS verwenden:

<sec:ifAllGranted roles="ROLE_ADMIN"> 
show something 
</sec:ifAllGranted> 

Also zurück zu Ihrer Frage:

Sie haben:

Set<RoleGroup> getAuthorities() { 
     [profile] 
    } 

Ist das etwas, was Sie in PU haben an Ort und Stelle?

Von dort, wo es ist:

class RoleGroup implements Serializable { 

    private static final long serialVersionUID = 1 

    String name  

    Set<Role> getAuthorities() { 
     RoleGroupRole.findAllByRoleGroup (this)*.role 
    }  
} 

Dies sollten Sie alle Behörden auflisten

User user = User.get(1L) 
def authorities = user?.profile?.getAuthorities() 
Verwandte Themen