spring-securityAan de slag met lente-beveiliging


Opmerkingen

Deze sectie geeft een overzicht van wat veerbeveiliging is en waarom een ontwikkelaar het misschien wil gebruiken.

Het moet ook alle grote onderwerpen binnen spring-security vermelden en een link naar de gerelateerde onderwerpen. Aangezien de documentatie voor lente-beveiliging nieuw is, moet u mogelijk eerste versies van die gerelateerde onderwerpen maken.

versies

Versie Publicatiedatum
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 lente beveiliging

Opmerking 1: U hebt enige voorkennis nodig over de Java-servletpagina (JSP) en Apache Maven voordat u aan deze voorbeelden begint.

Start de webserver (zoals Apache tomcat ) met een bestaand webproject of maak er een.

Bezoek de index.jsp .

Iedereen heeft toegang tot die pagina, het is onzeker!


Toepassing beveiligen

  1. Update Maven-afhankelijkheden

Afhankelijkheden toevoegen aan uw pom.xml-bestand

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>
 

Opmerking 1: Als u "Lente" niet eerder in uw project gebruikt, is er geen afhankelijkheid over "lente-context". Dit voorbeeld gebruikt xml config met "spring-context". Dus voeg deze afhankelijkheid ook toe.

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

Opmerking 2: Als u JSTL niet eerder in uw project gebruikt, is daar geen afhankelijkheid van. In dit voorbeeld wordt JSTL op de jsp-pagina gebruikt. Dus voeg deze afhankelijkheid ook toe.

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

  1. Maak Spring Security configuratiebestand aan

Maak de mapnaam "spring" in de map "WEB-INF" en maak het bestand security.xml. Kopieer en plak van volgende codes.

WEB-INF / blad / 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. Update web.xml

Update uw web.xml in de map "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>
 

Opmerking: als u "Spring" niet eerder in uw project gebruikt, zijn er geen configuraties over het laden van Spring-contexten. Dus voeg deze parameter en luisteraar ook toe.

<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>
 

Actieve webtoepassing uitvoeren

Nadat u uw webserver hebt uitgevoerd en index.jsp hebt bezocht, ziet u de standaardaanmeldingspagina die is gegenereerd door spring security. Omdat u niet bent geverifieerd.

inlogpagina die is gegenereerd door spring security

U kunt inloggen

username : stackoverflow
password : pwd
 

Opmerking: gebruikersnaam en wachtwoord instellen op WEB-INF / spring / security.xml


Gebruikersnaam weergeven

Het toevoegen van jstl-tag na "Hallo", waarmee de gebruikersnaam wordt afgedrukt

index.jsp

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

Gebruikersnaam weergeven


Uitloggen

index.jsp

Formulier toevoegen, tags invoeren na "Hallo gebruikersnaam", die het genereren van uitgelogde url / logout van voorjaarsbeveiliging opleverde.

<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>
 

Wanneer u zich succesvol afmeldt, ziet u de automatisch gegenereerde aanmeldingspagina opnieuw. Omdat je nu niet bent geverifieerd.

Knop Uitloggen, succes van uitloggen

Installatie of instellingen

Gedetailleerde instructies voor het instellen of installeren van veerbeveiliging.

Spring Securitiy om REST API-eindpunten te beschermen

Voeg onderstaande vermeldingen toe 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>
 

Belangrijk voor de Spring-versie groter dan 3.1:

org.springframework.security.filterChains voor org.springframework.security.filterChains komt wanneer u de Spring-versie hoger dan 3.1 gebruikt en geen afhankelijkheden handmatig hebt toegevoegd voor spring-aop , spring-jdbc , spring-tx en spring-expressions in uw pom.xml .

Voeg onderstaande items toe in Spring context. We willen twee REST-eindpunten beschermen (helloworld & tot ziens). Pas de XSD-versie aan volgens de Spring-versie.

<?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>
 

Voeg onderstaande vermeldingen toe 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 met behulp van spring-boot en JDBC-authenticatie

Stel dat u wilt voorkomen dat ongeautoriseerde gebruikers toegang krijgen tot de pagina, dan moet u hen belemmeren door toegang te autoriseren. We kunnen dit doen door gebruik te maken van veerbeveiliging die basisverificatie biedt door alle HTTP-eindpunten te beveiligen. Daarvoor moet je spring-security afhankelijkheid toevoegen aan je project, in maven kunnen we de afhankelijkheid toevoegen als:

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

Hier is een beveiligingsconfiguratie die ervoor zorgt dat alleen geverifieerde gebruikers toegang hebben.

@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;
}
}
 
Configuratie Beschrijving
@Configuration Geeft aan dat de klasse kan worden gebruikt door de Spring IoC-container als een bron van bonendefinities.
@Order (SecurityProperties.ACCESS_OVERRIDE_ORDER) Overschrijf de toegangsregels zonder andere automatisch geconfigureerde functies te wijzigen. Lagere waarden hebben een hogere prioriteit.
WebSecurityConfigurerAdapter De klasse SecurityConfig breidt een aantal methoden uit en vervangt deze om enkele details van de beveiligingsconfiguratie in te stellen.
@Autowired van DataSource Lever fabriek voor verbindingen met de fysieke gegevensbron.
configure(HttpSecurity) Overschreven methode definieert welke URL-paden moeten worden beveiligd en welke niet.
.authorizeRequests().anyRequest() .fullyAuthenticated() Hiermee wordt aangegeven dat alle verzoeken voor onze toepassing moeten worden geverifieerd.
.formLogin() Configureert een op formulieren gebaseerde aanmelding
.loginPage("/login").failureUrl("/login?error").permitAll() Specificeert de locatie van de inlogpagina en alle gebruikers moeten toegang krijgen tot de pagina.
.logout().logoutUrl("/logout") .logoutSuccessUrl("/login?logout").permitAll() De URL waarnaar wordt omgeleid nadat zich heeft afgemeld. De standaardinstelling is / login? Logout.
.csrf() Gebruikt om Cross Site Request Forgery te voorkomen, is CSRF-beveiliging ingeschakeld (standaard).
configure(AuthenticationManagerBuilder){} Overschreven methode om te definiëren hoe de gebruikers worden geverifieerd.
.jdbcAuthentication().dataSource(datasource) Geeft aan dat we JDBC-verificatie gebruiken
.passwordEncoder(passwordEncoder()) Geeft aan dat we een wachtwoordcoder moeten gebruiken om onze wachtwoorden te coderen. (Er wordt een bean gemaakt om de keuze van het wachtwoord Encoder te retourneren, we gebruiken BCrypt in dit geval)

Merk op dat we geen tabelnaam of een query hebben geconfigureerd, dit komt omdat spring security standaard zoekt naar de onderstaande tabellen:

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));
 

Voeg de volgende rijen in de bovenstaande tabellen in:

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

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

De gebruikersnaam is in ons geval user en het wachtwoord is ook door de user versleuteld met het BCrypt-algoritme

Configureer ten slotte een gegevensbron in de application.properties die Spring Boot moet gebruiken:

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

Opmerking: Maak en configureer een login-controller en wijs deze toe aan het pad /login en wijs uw login-pagina naar deze controller