मेरे पास कुछ नियंत्रकों के साथ एक Spring Boot 2 एप्लिकेशन है।
मैं Spring Security जोड़ना चाहता हूं और केवल प्रमाणित उपयोगकर्ताओं के लिए कुछ यूआरएल की अनुमति देना चाहता हूं, जबकि अन्य सभी के लिए सुलभ होना चाहिए।
लेकिन जब मैं सुरक्षा प्रति-यूआरएल को कॉन्फ़िगर करने के लिए WebSecurityConfigurerAdapter का उपयोग करता हूं, तो "/login" और "/error" के लिए स्वतः जेनरेट किए गए पृष्ठ गायब हो जाते हैं

यदि मैं सबसे सरल संभव कॉन्फ़िगरेशन जोड़ने का प्रयास करता हूं, तो यह सभी यूआरएल काम करता है और उनकी सुरक्षा करता है:

application.yml

spring:
  security:
    user:
      name: "admin"
      password: "1234"
      roles: "ADMIN"

pom.xml:

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

और प्रत्येक क्रिया मुझे लॉगिन फॉर्म के साथ /login पृष्ठ पर पुनर्निर्देशित करती है, जब तक कि मैं अपने द्वारा कॉन्फ़िगर किए गए क्रेडेंशियल के साथ लॉग इन नहीं करता।

हालांकि, अगर मैं व्यवहार को अनुकूलित करने के लिए कॉन्फ़िगरेशन क्लास जोड़ता हूं, तो डिफ़ॉल्ट लॉगिन फॉर्म गायब लगता है, और मुझे इसके बजाय /error पेज मिलता रहता है क्योंकि /login जैसा कोई संसाधन नहीं है:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .inMemoryAuthentication()
                .withUser("admin").password("1234").roles("ADMIN");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/private").hasRole("ADMIN")
                .antMatchers("/public").permitAll()
                .antMatchers("/", "/login", "/logout", "/error").permitAll()
                .antMatchers("/**").denyAll();
    }
}

यहां कुछ डीबग लॉग दिए गए हैं (बाकी को पठनीयता के लिए छोड़ दिया गया है):

DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Populated SecurityContextHolder with anonymous token: 'org.springframework.security.authentication.AnonymousAuthenticationToken@e4de2840: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@b364: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: null; Granted Authorities: ROLE_ANONYMOUS'
...
DEBUG o.s.s.w.u.m.AntPathRequestMatcher - Checking match of request : '/login'; against '/login'
DEBUG o.s.s.w.a.i.FilterSecurityInterceptor - Secure object: FilterInvocation: URL: /login; Attributes: [permitAll]
DEBUG o.s.s.w.a.i.FilterSecurityInterceptor - Previously Authenticated: org.springframework.security.authentication.AnonymousAuthenticationToken@e4de2840: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@b364: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: null; Granted Authorities: ROLE_ANONYMOUS
DEBUG o.s.s.access.vote.AffirmativeBased - Voter: org.springframework.security.web.access.expression.WebExpressionVoter@2a3c0a9c, returned: 1
DEBUG o.s.s.w.a.i.FilterSecurityInterceptor - Authorization successful
DEBUG o.s.s.w.a.i.FilterSecurityInterceptor - RunAsManager did not change Authentication object
DEBUG o.s.security.web.FilterChainProxy - /login reached end of additional filter chain; proceeding with original chain
DEBUG o.s.web.servlet.DispatcherServlet - GET "/login", parameters={}
DEBUG o.s.w.s.h.SimpleUrlHandlerMapping - Mapped to ResourceHttpRequestHandler ["classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/", "/"]
DEBUG o.s.o.j.s.OpenEntityManagerInViewInterceptor - Opening JPA EntityManager in OpenEntityManagerInViewInterceptor
DEBUG o.s.w.s.r.ResourceHttpRequestHandler - Resource not found
DEBUG o.s.s.w.h.writers.HstsHeaderWriter - Not injecting HSTS header since it did not match the requestMatcher org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@27581ee6
DEBUG o.s.s.w.c.HttpSessionSecurityContextRepository - SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.
DEBUG o.s.o.j.s.OpenEntityManagerInViewInterceptor - Closing JPA EntityManager in OpenEntityManagerInViewInterceptor
DEBUG o.s.web.servlet.DispatcherServlet - Completed 404 NOT_FOUND
DEBUG o.s.s.w.a.ExceptionTranslationFilter - Chain processed normally
DEBUG o.s.s.w.c.SecurityContextPersistenceFilter - SecurityContextHolder now cleared, as request processing completed
DEBUG o.s.security.web.FilterChainProxy - /error at position 1 of 11 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'
...
DEBUG o.s.security.web.FilterChainProxy - /error reached end of additional filter chain; proceeding with original chain
DEBUG o.s.web.servlet.DispatcherServlet - "ERROR" dispatch for GET "/error", parameters={}
DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#errorHtml(HttpServletRequest, HttpServletResponse)
DEBUG o.s.o.j.s.OpenEntityManagerInViewInterceptor - Opening JPA EntityManager in OpenEntityManagerInViewInterceptor
DEBUG o.s.w.s.v.ContentNegotiatingViewResolver - Selected 'text/html' given [text/html, text/html;q=0.8]
DEBUG o.s.o.j.s.OpenEntityManagerInViewInterceptor - Closing JPA EntityManager in OpenEntityManagerInViewInterceptor
DEBUG o.s.web.servlet.DispatcherServlet - Exiting from "ERROR" dispatch, status 404
DEBUG o.s.s.w.a.ExceptionTranslationFilter - Chain processed normally
DEBUG o.s.s.w.c.HttpSessionSecurityContextRepository - SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.
DEBUG o.s.s.w.c.SecurityContextPersistenceFilter - SecurityContextHolder now cleared, as request processing completed

अंत में मुझे ब्राउज़र में त्रुटि पृष्ठ मिलता है, जिसमें कहा गया है कि कोई /error पृष्ठ भी नहीं है।

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Tue Jan 21 14:53:17 CET 2020
There was an unexpected error (type=Not Found, status=404).
Not Found

किसी कारण से, जब मैं WebSecurityConfigurerAdapter कॉन्फ़िगरेशन वर्ग का उपयोग करता हूं, तो "/login" और "/error" के लिए स्वतः जेनरेट किए गए पृष्ठ गायब हो जाते हैं। वे कहाँ गए हैं?

इसके अलावा, यह Previously Authenticated: मुझे संदेहास्पद लगता है, क्योंकि यह एक नई शुरुआत थी। लेकिन अगर मैं http.anonymous().disable() के साथ अनाम उपयोगकर्ताओं को अक्षम करने का प्रयास करता हूं, तो मुझे किसी भी यूआरएल के लिए 403 त्रुटि मिलनी शुरू हो जाती है। क्या यह संबंधित हो सकता है?

1
Viacheslav Shalamov 22 जिंदा 2020, 14:10

1 उत्तर

सबसे बढ़िया उत्तर

आप गायब हैं: .formLogin().loginPage("/login")

कुछ इस तरह:

 http
        .authorizeRequests()
        .antMatchers("/private").hasRole("ADMIN")
        .antMatchers("/public").permitAll()
        .antMatchers("/", "/login", "/logout", "/error").permitAll()
        .antMatchers("/**").denyAll()
        .and().formLogin().loginPage("/login");
2
user10871691user10871691 22 जिंदा 2020, 16:21