1. 개요

이 예제 에서는 Spring을 사용하여 기본 인증 을 설정, 구성 및 사용자 지정하는 방법을 설명합니다 . 간단한 Spring MVC 예제 위에 빌드하고 Spring Security에서 제공하는 기본 인증 메커니즘으로 MVC 애플리케이션의 UI를 보호할 것입니다.

2. 스프링 시큐리티 설정

Java 구성을 사용하여 Spring Security를 ​​구성할 수 있습니다.

@Configuration
@EnableWebSecurity
public class CustomWebSecurityConfigurerAdapter {

    @Autowired private MyBasicAuthenticationEntryPoint authenticationEntryPoint;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
          .inMemoryAuthentication()
          .withUser("user1")
          .password(passwordEncoder().encode("user1Pass"))
          .authorities("ROLE_USER");
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/securityNone")
            .permitAll()
            .anyRequest()
            .authenticated()
            .and()
            .httpBasic()
            .authenticationEntryPoint(authenticationEntryPoint);
        http.addFilterAfter(new CustomFilter(), BasicAuthenticationFilter.class);
        return http.build();
    }
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

여기서 우리는 SecurityFilterChain내부에 기본 인증을 정의하기 위해 httpBasic() 요소를 사용하고 있습니다.

XML을 사용해도 동일한 결과를 얻을 수 있습니다.

<http pattern="/securityNone" security="none"/>
<http use-expressions="true">
    <intercept-url pattern="/**" access="isAuthenticated()" />
    <http-basic />
</http>

<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="user1" password="{noop}user1Pass" authorities="ROLE_USER" />
        </user-service>
    </authentication-provider>
</authentication-manager>

여기서 중요한 것은 구성의 기본 <http> 요소 안에 있는 <http-basic> 요소 입니다. 이는 전체 애플리케이션에 대해 기본 인증을 활성화하기에 충분합니다. 이 사용방법(예제)에서는 인증 관리자에 중점을 두지 않으므로 일반 텍스트로 정의된 사용자 및 암호와 함께 메모리 내 관리자를 사용합니다.

Spring Security를 ​​활성화하는 웹 애플리케이션 의 web.xml 은 Spring Logout 예제 에서 이미 논의되었습니다 .

3. Security 애플리케이션 사용

curl 명령 은 Security 애플리케이션을 사용하기 위한 이동 도구입니다.

먼저 Security 자격 증명을 제공하지 않고 /homepage.html 을 요청해 보겠습니다.

curl -i http://localhost:8080/spring-security-rest-basic-auth/api/foos/1

예상되는 401 UnauthorizedAuthentication Challenge 를 반환합니다 .

HTTP/1.1 401 Unauthorized
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=E5A8D3C16B65A0A007CFAACAEEE6916B; Path=/spring-security-mvc-basic-auth/; HttpOnly
WWW-Authenticate: Basic realm="Spring Security Application"
Content-Type: text/html;charset=utf-8
Content-Length: 1061
Date: Wed, 29 May 2013 15:14:08 GMT

일반적으로 브라우저는 이 문제를 해석하고 간단한 대화 상자로 자격 증명을 묻는 메시지를 표시하지만 curl 을 사용하고 있으므로 그렇지 않습니다.

이제 동일한 리소스인 홈페이지를 요청하되 여기에 액세스할 수 있는 자격 증명도 제공합니다 .

curl -i --user user1:user1Pass 
  http://localhost:8080/spring-security-rest-basic-auth/api/foos/1

결과적으로 서버의 응답은 쿠키 와 함께 200 OK 입니다 .

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=301225C7AE7C74B0892887389996785D; Path=/spring-security-mvc-basic-auth/; HttpOnly
Content-Type: text/html;charset=ISO-8859-1
Content-Language: en-US
Content-Length: 90
Date: Wed, 29 May 2013 15:19:38 GMT

브라우저에서 애플리케이션을 정상적으로 사용할 수 있습니다. 유일한 차이점은 모든 브라우저가 기본 인증을 지원하고 사용자에게 자격 증명을 묻는 대화 상자를 사용하기 때문에 로그인 페이지가 더 이상 어려운 요구 사항이 아니라는 점입니다.

4. 추가 구성 – 진입점

기본적 으로 Spring Security에서 제공 하는 BasicAuthenticationEntryPoint 는 401 Unauthorized 응답에 대한 전체 페이지를 클라이언트에 다시 반환합니다. 오류에 대한 이 HTML 표현은 브라우저에서 잘 렌더링됩니다. 반대로 json 표현이 선호될 수 있는 REST API와 같은 다른 시나리오에는 적합하지 않습니다.

네임스페이스는 이 새로운 요구 사항에도 충분히 유연합니다. 이 문제를 해결하기 위해 진입점을 재정의할 수 있습니다.

<http-basic entry-point-ref="myBasicAuthenticationEntryPoint" />

새 진입점은 표준 빈으로 정의됩니다.

@Component
public class MyBasicAuthenticationEntryPoint extends BasicAuthenticationEntryPoint {

    @Override
    public void commence(
      HttpServletRequest request, HttpServletResponse response, AuthenticationException authEx) 
      throws IOException, ServletException {
        response.addHeader("WWW-Authenticate", "Basic realm="" + getRealmName() + """);
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        PrintWriter writer = response.getWriter();
        writer.println("HTTP Status 401 - " + authEx.getMessage());
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        setRealmName("Baeldung");
        super.afterPropertiesSet();
    }
}

HTTP 응답에 직접 작성함으로써 이제 Response body의 형식을 완전히 제어할 수 있습니다.

5. Maven 의존성

Spring Security에 대한 Maven 의존성은 이전에 Maven을 사용한 Spring Security 기사 에서 논의되었습니다 . 런타임에 사용 가능한 spring -security-webspring-security-config 가 모두 필요 합니다.

6. 결론

이 기사에서는 Spring Security 및 기본 인증을 사용하여 MVC 애플리케이션을 보호했습니다. 우리는 XML 구성에 대해 논의했고 간단한 curl 명령으로 애플리케이션을 사용했습니다. 마지막으로 표준 HTML 오류 페이지에서 사용자 지정 텍스트 또는 JSON 형식으로 이동하여 정확한 오류 메시지 형식을 제어했습니다.

이 문서의 전체 구현은 GitHub 프로젝트 에서 찾을 수 있습니다 . 이것은 Maven 기반 프로젝트이므로 그대로 가져오고 실행하기 쉬워야 합니다.

프로젝트가 로컬에서 실행될 때 다음 위치에서 샘플 HTML에 액세스할 수 있습니다.

http://localhost:8080/spring-security-rest-basic-auth/api/foos/1 .

Security footer banner