geschätzt werden ich ein minimales Beispielanwendung mit Feder-Boot erstellt haben (wegen der „Feder“ Tag) und Shiro für Sie, die Sie here on GitHub finden. Die Beispielanwendung basiert auf der "hello world" RESTful web service with Spring application aus der Spring-Dokumentation. Ich habe Shiro es über these changes (GitHub commit) hinzugefügt:
Fügen Sie die shiro-spring
Abhängigkeit pom.xml:
</dependencies>
[...]
<!-- Apache Shiro -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
Kopieren shiro.ini vom Shiro docs zu Ressourcen:
# =============================================================================
# Tutorial INI configuration
#
# Usernames/passwords are based on the classic Mel Brooks' film "Spaceballs" :)
# =============================================================================
# -----------------------------------------------------------------------------
# Users and their (optional) assigned roles
# username = password, role1, role2, ..., roleN
# -----------------------------------------------------------------------------
[users]
root = secret, admin
guest = guest, guest
presidentskroob = 12345, president
darkhelmet = ludicrousspeed, darklord, schwartz
lonestarr = vespa, goodguy, schwartz
# -----------------------------------------------------------------------------
# Roles with assigned permissions
# roleName = perm1, perm2, ..., permN
# -----------------------------------------------------------------------------
[roles]
admin = *
schwartz = lightsaber:*
goodguy = winnebago:drive:eagle5
konfigurieren ShiroFilter, SecurityManager mit IniRealm und Shiro annotations in Application.java (angepasst von here):
hinzufügen @RequiresRoles
Anmerkung mit dem Parameter "admin" zu GreetingController
zu Testzwecken:
@RestController
public class GreetingController {
private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
@RequestMapping("/greeting")
@RequiresRoles(value = {"admin"})
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
return new Greeting(counter.incrementAndGet(),
String.format(template, name));
}
}
Verwenden Sie die folgenden Befehle, um die Anwendung zu prüfen und auszuführen:
git clone https://github.com/opncow/gs-rest-service.git
cd gs-rest-service/complete/
./mvnw spring-boot:run
Stellen Sie sicher, dass Shiro ist Arbeits (HttpRequester oder ähnliche Plugin verwenden Sie die folgenden Anfragen erstellen):
User "root" (hat "admin" Rolle) mit dem Passwort "secret" (Base64 codierte Benutzername: Passwort als Wert des Authorization-Header)
GET http://localhost:8080/greeting
Authorization: Basic cm9vdDpzZWNyZXQ=
-- response --
200
Set-Cookie: rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Thu, 11-May-2017 00:29:44 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Fri, 12 May 2017 00:29:44 GMT
{"id":1,"content":"Hello, World!"}
User "Gast" mit dem Kennwort "guest" (keine „admin "Rolle):
GET http://localhost:8080/greeting
Authorization: Basic Z3Vlc3Q6Z3Vlc3Q=
-- response --
500
Set-Cookie: rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Thu, 11-May-2017 00:44:18 GMT rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Thu, 11-May-2017 00:44:18 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Fri, 12 May 2017 00:44:18 GMT
Connection: close
{"timestamp":1494549858572,"status":500,"error":"Internal Server Error","exception":"org.apache.shiro.authz.UnauthorizedException","message":"Subject does not have role [admin]","path":"/greeting"}
Wie zu sehen ist, in der zweiten Anfrage, wird der Benutzer Gast authentifiziert, autorisiert jedoch nicht den gruß Ressource zu verwenden, da die fehlende‚admin‘Rolle (was bedeutet, dass die Anmerkung ist Arbeiten).
Dies ist die minimale Beispiel ich mir vorstellen konnte. Es verwendet Shiros .ini-Konfiguration/Realm für Benutzer, Passwörter und Rollen. Für ein echtes Projekt werden Sie wahrscheinlich ein anspruchsvolleres Bereich Implementierung wie Shiros JdbcRealm
verwenden müssen