Wenn Sie können, wechseln Sie zunächst zu Spring Boot
. Die Konfiguration wird dann einfacher.
Ja, in Ihrer WebSecurityConfigurerAdapterImpl
können Sie angeben, dass der Benutzer eine bestimmte Rolle haben muss, um auf bestimmte Bereiche zuzugreifen. In Ihrem Fall wäre es
sein
http
.antMatches("/admin/**").hasRole(<UserRole.Admin>);
Sie auch PreAuthorize
verwenden können:
@Controller
@RequestMapping("/admin")
public class AdminController{
@PreAuthorize("hasRole('ROLE_ADMIN')")
@GetMapping
public ModelAndView admin(HttpSession session){
}
@PreAuthorize("hasRole('ROLE_ADMIN')")
@GetMapping("/addUser")
public ModelAndView user(HttpSession session){
}
@PreAuthorize("hasRole('ROLE_ADMIN')")
@GetMapping("/addBook")
public ModelAndView book(HttpSession session){
}
}
Sie haben mit dieser Anmerkung zu ermöglichen. Es ist frei in der Documentation.
Also zusammenfassend, müssen Sie Spring Security
, dann entweder Zugang in WebSecurityConfigurerAdapter
konfigurieren oder Annotation-basierte Zugriffskontrolle ermöglichen und dann die @PreAuthorize
angeben.
Edit:
OK, da die OP zur Klärung gebeten hat, habe ich beschlossen, über die Verwendung von Spring Security
einige allgemeinere Informationen hinzuzufügen.
In Spring Security
basieren wir auf UserDetails
und UserDetailsService
, die bei der Anmeldung UserDetails
zurückgibt. Obwohl, ich empfehle Ihnen, Ihren Code zu refaktorieren und nur eine Klasse User
zu haben, die eine Collection
von authorities
hat, können Sie das folgende tun.
Erstellen Sie eine neue Klasse, die UserDetailsImpl
wäre, die UserDetails
implementieren würde. Erstellen Sie auch einige benutzerdefinierte Rollen wie ROLE_USER
, ROLE_ADMIN
. Sie sollten ein enum sein. Dann in Ihrem UserDetailsImpl
haben Felder, die während der Sitzung wichtig sind - geloggte Benutzer-UUID, Name, E-Mail und einige irgendwie von der Schnittstelle erforderlich - isAccountLocked
, isPasswordExpired
etc, Auch Sie brauchen eine Sammlung von Behörden, die Sie von einem bestimmten zurückgeben werden Methode.
Sie können dann hasRole
in Ihrem Code verwenden. Was ist cool, Sie können auch die protokollierten Benutzerdetails in Ihrer Anwendung aus dem Kontext abrufen.
Ich habe keine Instanzvariable/enum als Rolle. Login-Objekt hat Benutzer-ID. Bei der Anmeldung überprüfe ich, ob das Benutzerobjekt (das von db abgerufen wurde) eine Instanz der Klasse Admin ist, und leite es dann entsprechend weiter. Kann ich mit diesem Ansatz etwas Ähnliches machen? –
@ShashankRaghunath ok, das Thema ist ziemlich weit, aber ich werde es für Sie in der Antwort in einer Minute beschreiben – xenteros