Looking for spring-security Keywords? Try Ask4Keywords

spring-securityErste Schritte mit der Frühlingssicherheit


Bemerkungen

Dieser Abschnitt bietet einen Überblick über die Frühlingssicherheit und warum ein Entwickler sie verwenden möchte.

Es sollte auch alle großen Themen der Frühlingssicherheit erwähnen und auf die verwandten Themen verweisen. Da die Dokumentation zur Frühjahrssicherheit neu ist, müssen Sie möglicherweise erste Versionen dieser verwandten Themen erstellen.

Versionen

Ausführung Veröffentlichungsdatum
4.2.2 2017-03-02
3.2.10 2016-12-22
4.2.1 2016-12-21
4.1.4 2016-12-21
4.2.0 2016-11-10

Hallo, Frühlingssicherheit

Hinweis 1: Bevor Sie mit diesen Beispielen beginnen, benötigen Sie Vorkenntnisse zur Java-Servlet-Seite (JSP) und Apache Maven .

Starten Sie den Webserver (wie Apache Tomcat ) mit einem vorhandenen Webprojekt oder erstellen Sie eines.

Besuchen Sie die index.jsp .

Jeder kann auf diese Seite zugreifen, sie ist unsicher!


Anwendung sichern

  1. Aktualisieren Sie Maven-Abhängigkeiten

Hinzufügen von Abhängigkeiten zu Ihrer pom.xml-Datei

pom.xml

<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-web</artifactId>
  <version>4.0.1.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-config</artifactId>
  <version>4.0.1.RELEASE</version>
</dependency>
 

Hinweis 1: Wenn Sie in Ihrem Projekt noch nicht "Frühling" verwenden, besteht keine Abhängigkeit von "Federkontext". In diesem Beispiel wird xml config mit "spring-context" verwendet. Fügen Sie diese Abhängigkeit also hinzu.

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>4.2.2.RELEASE</version>
</dependency>
 

Hinweis 2: Wenn Sie in Ihrem Projekt noch keine JSTL verwenden, besteht keine Abhängigkeit davon. In diesem Beispiel wird JSTL in der JSP-Seite verwendet. Fügen Sie diese Abhängigkeit also hinzu.

<dependency>
  <groupId>org.glassfish.web</groupId>
  <artifactId>javax.servlet.jsp.jstl</artifactId>
  <version>1.2.1</version>
</dependency>
 

  1. Spring Security-Konfigurationsdatei erstellen

Machen Sie den Ordnernamen "spring" im Ordner "WEB-INF" und erstellen Sie die Datei security.xml. Kopieren und Einfügen aus den nächsten Codes.

WEB-INF / spring / security.xml

<b:beans xmlns="http://www.springframework.org/schema/security"
         xmlns:b="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                             http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">

  <http />

  <user-service>
    <user name="stackoverflow" password="pwd" authorities="ROLE_USER" />
  </user-service>

</b:beans>
 

  1. Aktualisieren Sie web.xml

Aktualisieren Sie Ihre web.xml im Ordner "WEB-INF"

WEB-INF / web.xml

<filter>
  <filter-name>springSecurityFilterChain</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
  <filter-name>springSecurityFilterChain</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
 

Hinweis: Wenn Sie in Ihrem Projekt noch nicht "Spring" verwenden, gibt es keine Konfigurationen zum Laden von Spring-Kontexten. Fügen Sie also diesen Parameter und den Listener hinzu.

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
    /WEB-INF/spring/*.xml
  </param-value>
</context-param>

<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
 

Sichere Webanwendung ausführen

Nach dem Ausführen Ihres Webservers und dem Besuch von index.jsp wird die Standardanmeldeseite angezeigt, die durch die Frühlingssicherheit erzeugt wird. Weil Sie nicht authentifiziert sind.

Login-Seite, die durch Federsicherheit erzeugt wird

Sie können sich anmelden

username : stackoverflow
password : pwd
 

Hinweis: Benutzername und Passwort in WEB-INF / spring / security.xml


Benutzername anzeigen

Wenn Sie jstl-Tag nach dem "Hallo" hinzufügen, wird der Benutzername ausgegeben

index.jsp

<h1>Hello <c:out value="${pageContext.request.remoteUser}" />!!</h1>
 

Benutzername anzeigen


Ausloggen

index.jsp

Hinzufügen von Formularen, Eingabe-Tags nach "Hallo Benutzername", die das Senden der URL / Abmeldung von Spring Security generierten.

<h1>Hello <c:out value="${pageContext.request.remoteUser}" />!!</h1>

<form action="/logout" method="post">
  <input type="submit" value="Log out" />
  <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
</form>
 

Wenn Sie sich erfolgreich abgemeldet haben, wird die automatisch erzeugte Anmeldeseite erneut angezeigt. Wegen Ihnen werden Sie jetzt nicht authentifiziert.

Schaltfläche Abmelden, Erfolg beim Abmelden

Installation oder Setup

Detaillierte Anweisungen zum Einrichten oder Installieren der Federsicherheit.

Frühjahrssicherheit zum Schutz der REST-API-Endpunkte

Fügen Sie unten Einträge in pom.xml .

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>3.1.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>3.1.0.RELEASE</version>
</dependency>
 

Wichtig für die Frühlingsversion größer als 3.1:

Ein Bean-Erstellungsfehler für org.springframework.security.filterChains tritt auf, wenn Sie die Spring-Version höher als 3.1 verwenden und keine Abhängigkeiten für spring-aop , spring-jdbc , spring-tx und spring-expressions in pom.xml manuell hinzugefügt haben.

Fügen Sie im Spring-Kontext die folgenden Einträge hinzu. Wir möchten zwei REST-Endpunkte schützen (helloworld und auf Wiedersehen). Passen Sie die XSD-Version entsprechend der Spring-Version an.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:security="http://www.springframework.org/schema/security"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
                       http://www.springframework.org/schema/security
                       http://www.springframework.org/schema/security/spring-security-3.1.xsd">
                               
    <security:http auto-config='true' create-session="never">
        <security:intercept-url pattern="/helloworld/**" access="ROLE_USER" />
        <security:intercept-url pattern="/goodbye/**" access="ROLE_ADMIN" />
        <security:intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <security:http-basic />
    </security:http>

    <security:authentication-manager>
        <security:authentication-provider>
            <security:user-service>
                <security:user name="username1" password="password1"
                    authorities="ROLE_USER" />
                <security:user name="username2" password="password2"
                    authorities="ROLE_ADMIN" />
            </security:user-service>
        </security:authentication-provider>
    </security:authentication-manager>
</beans>
 

Fügen Sie folgende Einträge in web.xml .

<!-- Spring security-->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:security-context.xml</param-value>
</context-param>
 

Spring-Security mit Spring-Boot und JDBC-Authentifizierung

Angenommen, Sie möchten verhindern, dass unbefugte Benutzer auf die Seite zugreifen, und dann müssen Sie sie durch die Autorisierung des Zugriffs behindern. Wir können dies tun, indem wir die Frühlingssicherheit verwenden, die eine grundlegende Authentifizierung durch Sichern aller HTTP-Endpunkte bereitstellt. Dazu müssen Sie Ihrem Projekt eine Frühjahrssicherheitsabhängigkeit hinzufügen. In maven können wir die Abhängigkeit folgendermaßen hinzufügen:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
 

Hier ist eine Sicherheitskonfiguration, die sicherstellt, dass nur authentifizierte Benutzer darauf zugreifen können.

@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
DataSource datasource;

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .anyRequest()
            .fullyAuthenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .failureUrl("/login?error")
            .permitAll()
            .and()
        .logout()
            .logoutUrl("/logout")
            .logoutSuccessUrl("/login?logout")
            .permitAll()
            .and()
        .csrf();
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.jdbcAuthentication().dataSource(datasource).passwordEncoder(passwordEncoder());
}

@Bean
public PasswordEncoder passwordEncoder() {
    PasswordEncoder encoder = new BCryptPasswordEncoder();
    return encoder;
}
}
 
Aufbau Beschreibung
@Configuration Gibt an, dass die Klasse vom Spring-IoC-Container als Quelle für Bean-Definitionen verwendet werden kann.
@Order (SecurityProperties.ACCESS_OVERRIDE_ORDER) Überschreiben Sie die Zugriffsregeln, ohne andere automatisch konfigurierte Funktionen zu ändern. Niedrigere Werte haben eine höhere Priorität.
WebSecurityConfigurerAdapter Die SecurityConfig Klasse erweitert und überschreibt einige ihrer Methoden, um einige Besonderheiten der Sicherheitskonfiguration festzulegen.
@Autowired von DataSource Stellen Sie Factory für Verbindungen zur physischen Datenquelle bereit.
configure(HttpSecurity) Überschriebene Methode definiert, welche URL-Pfade gesichert werden sollen und welche nicht.
.authorizeRequests().anyRequest() .fullyAuthenticated() Gibt an, dass alle Anfragen an unsere Anwendung authentifiziert werden müssen.
.formLogin() Konfiguriert eine formularbasierte Anmeldung
.loginPage("/login").failureUrl("/login?error").permitAll() Gibt den Speicherort der Anmeldeseite an, und alle Benutzer sollten zum Zugriff auf die Seite berechtigt sein.
.logout().logoutUrl("/logout") .logoutSuccessUrl("/login?logout").permitAll() Die URL, zu der nach dem Abmelden umgeleitet werden soll. Die Standardeinstellung ist / login? Logout.
.csrf() CSRF-Schutz ist aktiviert, um Cross-Site-Request-Fälschung zu verhindern (Standard).
configure(AuthenticationManagerBuilder){} Überschriebene Methode, um zu definieren, wie die Benutzer authentifiziert werden.
.jdbcAuthentication().dataSource(datasource) Zeigt an, dass wir die JDBC-Authentifizierung verwenden
.passwordEncoder(passwordEncoder()) Zeigt an, dass wir einen Passwort-Encoder verwenden, um unsere Passwörter zu codieren. (Ein Bean wird erstellt, um die Wahl des Passwort-Encoders zurückzugeben. In diesem Fall verwenden wir BCrypt.)

Beachten Sie, dass wir keinen zu verwendenden Tabellennamen oder keine Abfrage konfiguriert haben. Dies liegt daran, dass die Federsicherheit standardmäßig nach den folgenden Tabellen sucht:

create table users (   
  username varchar(50) not null primary key,
  password varchar(255) not null,
  enabled boolean not null) ;

create table authorities (
  username varchar(50) not null,
  authority varchar(50) not null,
  foreign key (username) references users (username),
  unique index authorities_idx_1 (username, authority));
 

Fügen Sie die folgenden Zeilen in die obigen Tabellen ein:

INSERT INTO authorities(username,authority) 
VALUES ('user', 'ROLE_ADMIN');

INSERT INTO users(username,password,enabled)
VALUES('user', '$2a$10$JvqOtJaDys0yoXPX9w47YOqu9wZr/PkN1dJqjG9HHAzMyu9EV1R4m', '1');
 

Der Benutzername ist in unserem Fall user und das Passwort ist auch user mit BCrypt Algorithmus verschlüsselt

Konfigurieren Sie abschließend eine Datenquelle in der Datei "application.properties", damit Spring Boot verwendet werden kann:

spring.datasource.url = jdbc:mysql://localhost:3306/spring
spring.datasource.username = root
spring.datasource.password = Welcome123
 

Hinweis: Erstellen und konfigurieren Sie einen Login-Controller, ordnen Sie ihn dem Pfad /login und zeigen Sie Ihre Login-Seite an diesen Controller