1

我配置了所有的屬性,但我的應用仍然沒有彈簧安全加載,就好像它不存在...請幫助我,我做錯了什麼。彈簧安全+休息不起作用

在這裏,我把我的房間沒有權威性與郵差:

enter image description here

這下面是我的課:

SecurityConfiguration:

package com.vidaflo.config; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 
import org.springframework.security.config.annotation.web.builders.HttpSecurity; 
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 
import org.springframework.security.config.http.SessionCreationPolicy; 

@Configuration 
@EnableWebSecurity 
@ComponentScan("com.vidaflo") 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Autowired 
    public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception { 
     auth.inMemoryAuthentication().withUser("bill").password("abc123").roles("ADMIN"); 
     auth.inMemoryAuthentication().withUser("tom").password("abc123").roles("USER"); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.csrf().disable() 
       .authorizeRequests().antMatchers("/room/**").hasRole("ADMIN") 
       .and() 
       .httpBasic() 
       .and() 
       .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); 
    } 
} 

SecurityInitializer:

package com.vidaflo.config; 

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; 

public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer { 
} 

WebConfiguration:

package com.vidaflo.config; 

import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; 

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = "com.vidaflo.controllers") 
public class WebConfiguration extends WebMvcConfigurationSupport { 
} 

Tomcat的嵌入式:

package com.vidaflo.server; 

import com.vidaflo.config.ApplicationConfiguration; 
import com.vidaflo.config.DatabaseConfiguration; 
import com.vidaflo.config.SecurityConfiguration; 
import com.vidaflo.config.WebConfiguration; 
import lombok.extern.slf4j.Slf4j; 
import org.apache.catalina.LifecycleException; 
import org.apache.catalina.startup.Tomcat; 
import org.springframework.core.env.PropertiesPropertySource; 
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; 
import org.springframework.web.servlet.DispatcherServlet; 

@Slf4j 
public class Application { 
    private static final String APPLICATION_PROPERTIES = System.getProperty("app.properties"); 
    private static final int DEFAULT_PORT = 8080; 
    private static final String DEFAULT_CONTEXT_PATH = "/app"; 

    private AppProperties appProperties; 
    private AnnotationConfigWebApplicationContext ctx; 

    public static void main(String[] args) throws LifecycleException { 
     Application app = new Application(APPLICATION_PROPERTIES); 
     Server server = new TomcatServer(new Tomcat()); 
     app.run(server); 
    } 

    public Application(String fieldName) { 
     loadProperties(fieldName); 
    } 

    public void run(Server server) { 
     initApplicationContext(); 
     server.run(getConfig()); 
    } 

    private void loadProperties(String fieldName) { 
     appProperties = new AppProperties(); 
     appProperties.load(fieldName); 
    } 

    private void initApplicationContext() { 
     log.info("Initialize application context..."); 

     ctx = new AnnotationConfigWebApplicationContext(); 
     ctx.register(SecurityConfiguration.class); 
     ctx.register(ApplicationConfiguration.class); 
     ctx.register(WebConfiguration.class); 
     ctx.register(DatabaseConfiguration.class); 
     ctx.getEnvironment() 
      .getPropertySources() 
      .addLast(new PropertiesPropertySource("applicationEnvironment", appProperties.getProperties())); 
    } 

    private ServerConfig getConfig() { 
     ServerConfig serverConfig = new ServerConfig(); 
     serverConfig.setPort(appProperties.getPort(DEFAULT_PORT)); 
     serverConfig.setContextPath(appProperties.getContextPath(DEFAULT_CONTEXT_PATH)); 
     serverConfig.setServlet(getServlet()); 
     return serverConfig; 
    } 

    private DispatcherServlet getServlet() { 
     return new DispatcherServlet(ctx); 
    } 
} 

休息控制器:

package com.vidaflo.controllers; 

import com.vidaflo.dto.RoomDto; 
import com.vidaflo.model.location.Room; 
import com.vidaflo.repositories.LocationRepository; 
import com.vidaflo.services.RoomService; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.bind.annotation.GetMapping; 
import org.springframework.web.bind.annotation.PostMapping; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.bind.annotation.RestController; 

import java.util.List; 
import java.util.stream.Collectors; 

@RestController 
public class RoomController { 
    @Autowired 
    private RoomService roomService; 

    @Autowired 
    private LocationRepository locationService; 

    @PostMapping("/room/save") 
    public String save(@RequestParam(name = "name") String name, 
         @RequestParam(name = "location_id") Long locationId) { 
     roomService.save(name, locationService.findOne(locationId)); 
     return "room added"; 
    } 

    @GetMapping("/room/all") 
    public List<RoomDto> findAll() { 
     return roomService.findAll().stream() 
       .map(this::toDto) 
       .collect(Collectors.toList()); 
    } 

    private RoomDto toDto(Room room) { 
     return RoomDto.builder() 
       .id(room.getId()) 
       .name(room.getName()) 
       .build(); 
    } 
} 

請告訴我,如果我要補充額外的細節。我真的需要幫助,我不明白我做錯了什麼。

+0

@KimAragonEscobar是的,我有tried'「/ **」'和很多其他人,但它仍然沒有按't work – mrserfr

+1

我在控制器方法中添加了@Secured({「ROLE_ADMIN」})(我也嘗試過@Secured(「ADMIN」)'),並且在SecurityConfiguration中添加了@EnableGlobalMethodSecurity(securedEnabled = true)類,但現在我有一個異常'security.authentication.AuthenticationCredentialsNotFoundException:在SecurityContext中找不到Authentication對象;( – mrserfr

回答

1

找到了答案,我們需要手動在Tomcat中嵌入的配置添加濾鏡春季安全這樣的:

​​
-1

嘗試在configureGlobalSecurity方法和枚舉「角色」中將角色「ADMIN」「USER」更改爲「ROLE_ADMIN」「ROLE_USER」,但在configure方法中不更改。

+0

我們不能在'configure global security method'中使用帶前綴'ROLE_'的角色。 v e嘗試並得到異常:'ROLE_ADMIN不能以ROLE_開頭(它會自動添加) – mrserfr