标签: spring-java-config

使用Spring Security Java配置时禁用基本身份验证

我正在尝试使用Spring Security java配置来保护Web应用程序.

这是配置的外观: -

@Configuration
@EnableWebMvcSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    private String googleClientSecret;

    @Autowired
    private CustomUserService customUserService;

    /*
     * (non-Javadoc)
     * 
     * @see org.springframework.security.config.annotation.web.configuration.
     * WebSecurityConfigurerAdapter
     * #configure(org.springframework.security.config
     * .annotation.web.builders.HttpSecurity)
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        // @formatter:off
        http
            .authorizeRequests()
                .antMatchers(HttpMethod.GET, "/","/static/**", "/resources/**","/resources/public/**").permitAll()
                .anyRequest().authenticated()
            .and()
                .formLogin()
                    .and()
                .httpBasic().disable()
            .requiresChannel().anyRequest().requiresSecure();
        // @formatter:on
        super.configure(http);
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth)
            throws Exception {
        // @formatter:off
        auth
            .eraseCredentials(true)
            .userDetailsService(customUserService);
        // @formatter:on
        super.configure(auth);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我已使用以下方法明确禁用HTTP基本身份验证:

.httpBasic().disable()
Run Code Online (Sandbox Code Playgroud)

我在访问安全网址时仍然会收到HTTP …

spring-security spring-boot spring-java-config

13
推荐指数
2
解决办法
6万
查看次数

Spring Javaconfig bean间依赖关系

浏览Spring Javaconfig参考文档 http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/beans.html 我发现了一些令人困惑的部分......

"5.12.4使用@Configuration注释"部分中,它说:

"当@Beans彼此依赖时,表达该依赖关系就像让一个bean方法调用另一个一样简单:

@Configuration
public class AppConfig {
    @Bean
    public Foo foo() {
        return new Foo(bar());
    }
    @Bean
    public Bar bar() {
        return new Bar();
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,foo bean通过构造函数注入接收对bar的引用."

好吧,如果一切都是无状态的,那可能并不重要,但如果您有上面的配置,然后在您的应用程序中执行:

@Autowired 
private Foo foo;

@Autowired 
private Bar bar;
Run Code Online (Sandbox Code Playgroud)

检查豆的散列码,事实证明,你的私有变量会指不同的实例酒吧比一个通过使用,这可能不是你所期望的,对不对?

我想说正常模式应该是:

@Configuration
public class AppConfig {
    @Bean
    public Bar bar() {
        return new Bar();
    }
    @Autowired Bar bar;
    @Bean
    public Foo foo() {
        return new Foo(bar);
    }
} …
Run Code Online (Sandbox Code Playgroud)

spring dependency-injection spring-boot spring-java-config

13
推荐指数
1
解决办法
7375
查看次数

基于Spring Java的静态方法配置

任何人都可以建议为什么我们需要使用静态方法声明PropertySourcesPlaceholderConfigurer bean ?我刚刚发现如果我在下面使用非静态,那么url将被设置为null值而不是从属性文件中获取 -

@Value("${spring.datasource.url}")
private String url;

@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfig(String profile) {
    String propertyFileName = "application_"+profile+".properties";
    System.out.println(propertyFileName);
    PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
    configurer.setLocation(new ClassPathResource(propertyFileName));
    return configurer;
}   

@Bean
@Profile("local")
public static String localProfile(){
    return "local";
}

@Bean
@Profile("prod")
public static String prodProfile(){
    return "prod";
}
Run Code Online (Sandbox Code Playgroud)

spring-mvc spring-java-config

13
推荐指数
1
解决办法
5561
查看次数

使用Spring JavaConfig和@Autowired注入Mockito Mock对象

我正在尝试@Autowired用Mockito模拟对象替换对象.通常的方法是使用Springockito使用xml:

<mockito:mock id="SomeMock" class="com.package.MockInterface" />
Run Code Online (Sandbox Code Playgroud)

目前我正在尝试使用Spring的JavaConfig来完成这项工作.突然之间,Java表达式比xml更加冗长:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class MyTestClass {

    @Configuration
    static class Config {
        @Bean
        public MockInterface somethingSpecial() {
            return Mockito.mock(MockInterface.class);
        }
    }

    @Autowired MockInterface mockObj;

    // test code
}
Run Code Online (Sandbox Code Playgroud)

我发现了一个名为Springockito-annotations的库,它允许您执行以下操作:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=SpringockitoContextLoader.class)
public class MyTestClass {

    @Autowired @ReplaceWithMock MockInterface mockObj;

    // test code
}
Run Code Online (Sandbox Code Playgroud)

显然,一大堆漂亮:)唯一的问题是,这种情况下加载程序不会允许我使用@Configuration和JavaConfig其他豆类(如果我这样做,春天抱怨说没有匹配自动连接领域的考生).

你们知道如何让Spring的JavaConfig和Springockito-annotations发挥得更好吗?或者,是否有另一种创建模拟的简写?

作为一个很好的奖励,使用Springockito和xml配置,我能够模拟出具体的类而不为其依赖项提供自动装配候选(如果有的话).没有xml这是不可能的吗?

java spring integration-testing mockito spring-java-config

12
推荐指数
1
解决办法
9335
查看次数

Spring Security Java配置

最近我将Spring配置从XML迁移到Java配置.它是一个Spring OAuth 2服务器,一些端点受到客户端身份验证的保护,一些端点(confirm_access)受到用户身份验证的保护,用户身份验证通过过滤器("authenticationFilter")进行重定向委托给登录应用程序.但是我无法对Spring Security Java配置做同样的事情:

这是我工作的安全XML配置:

<sec:http pattern="/token" create-session="stateless" authentication-manager-ref="clientAuthenticationManager"
        entry-point-ref="oauthAuthenticationEntryPoint">
        <sec:intercept-url pattern="/token" access="IS_AUTHENTICATED_FULLY" />
        <sec:anonymous enabled="false" />
        <sec:http-basic entry-point-ref="oauthAuthenticationEntryPoint" />
        <!-- include this only if you need to authenticate clients via request parameters -->
        <sec:custom-filter ref="clientCredentialsTokenEndpointFilter" before="BASIC_AUTH_FILTER" />
        <sec:access-denied-handler ref="oauthAccessDeniedHandler" />
    </sec:http>

    <sec:http pattern="/css/**" security="none" />
    <sec:http pattern="/js/**" security="none" />

<sec:http access-denied-page="/errors/access-denied.html" disable-url-rewriting="true" entry-point-ref="authenticationEntryPoint">
        <sec:intercept-url pattern="/authorize" access="ROLE_USER" />
        <sec:intercept-url pattern="confirm_access" access="ROLE_USER" />
        <sec:intercept-url pattern="/device/authorize" access="ROLE_USER" />

        <sec:intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />

        <sec:custom-filter ref="authenticationFilter" before="ANONYMOUS_FILTER" />
        <sec:anonymous />
    </sec:http>

<sec:authentication-manager id="clientAuthenticationManager"> …
Run Code Online (Sandbox Code Playgroud)

java spring-security oauth-2.0 spring-java-config

12
推荐指数
1
解决办法
3万
查看次数

如何延迟Spring @Conditional配置注释的评估?

我有一个Spring @Configuration类,它应该在环境中设置特定属性值时注册bean.我编写了一个自定义Condition实现,检查该值是否存在,并且当我在Spring Boot中启动应用程序时它可以工作,但是在运行JUnit测试时从未注册过bean.我调试了应用程序并确定在实例化Condition之前正在评估PropertySourcesPlaceholderConfigurer它.

我修改了我Condition的实现ConfigurationCondition并在REGISTER_BEAN阶段中指定了评估.在实例化configurer之前仍然调用该方法,但是当我从属性文件中添加或删除属性时,已注册的bean现在来去.

这是重新评估评估的最佳方式吗?这是ConfigurationCondition接口的用途,还是我现在不小心让它上班?

@Conditional(PropertyCondition.class)
@Configuration
public class PostbackUrlConfiguration {
    @Value("${serviceName.postbackUrl}")
    String postbackUrl;

    @Bean
    public PostbackUrlProvider provider() {
        return new FixedUrlProvider(postbackUrl);
    }
}
Run Code Online (Sandbox Code Playgroud)

 

public class PropertyCondition implements ConfigurationCondition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return context.getEnvironment().containsProperty("serviceName.postbackUrl");
    }

    @Override
    public ConfigurationPhase getConfigurationPhase() {
        return ConfigurationPhase.REGISTER_BEAN;
    }
}
Run Code Online (Sandbox Code Playgroud)

测试配置是我测试用例的静态类:

@Configuration
@ComponentScan
@PropertySource("classpath:/postback.properties")
@Import(PostbackUrlConfiguration.class)
public static class TestConfig {
    @Bean
    public static PropertySourcesPlaceholderConfigurer …
Run Code Online (Sandbox Code Playgroud)

spring spring-java-config

12
推荐指数
1
解决办法
4076
查看次数

具有基于Java的配置的Spring Batch的可跳过异常类

我在XML中配置一个步骤,如下所示:

<batch:step id="slaveStep">
        <batch:tasklet>
            <batch:chunk
                    reader="reader"
                    processor="processor"
                    writer="writer"
                    commit-interval="10"
                    skip-limit="100000">
                <batch:skippable-exception-classes>
                    <batch:include class="MyException"/>
                </batch:skippable-exception-classes>
            </batch:chunk>
        </batch:tasklet>
    </batch:step>
Run Code Online (Sandbox Code Playgroud)

在java配置中,我使用这样的StepBuilder:

@Bean
public StepBuilder stepBuilder(String stepName)
{
    return new StepBuilder(stepName);
}

@Bean
Step slaveStep()
{
    return stepBuilder("slaveStep")
            .<Movie, Movie>chunk(10)
            .reader(reader(new HashMap<>()))
            .processor(processor())
            .writer(writer())
            .build();
}
Run Code Online (Sandbox Code Playgroud)

但我找不到配置可跳过的异常类的方法

java spring spring-batch spring-java-config

12
推荐指数
1
解决办法
9540
查看次数

Spring配置继承和@Import之间的区别

有什么区别

@Configuration
class ConfigA extends ConfigB {
   //Some bean definitions here
}
Run Code Online (Sandbox Code Playgroud)

@Configuration
@Import({ConfigB.class})
class ConfigA {
  //Some bean definitions here
}
Run Code Online (Sandbox Code Playgroud)
  1. 而且如果我们要导入多个配置文件,那么在各种配置中如何进行排序.
  2. 如果导入的文件之间存在依赖关系,会发生什么

java spring spring-java-config

12
推荐指数
1
解决办法
6587
查看次数

Spring Boot,Java Config - 在DispatcherServlet中找不到带有URI [/ ...]的HTTP请求的映射,名称为"dispatcherServlet"

这在stackOverflow中是一个非常常见的问题,但同一问题的主题都没有解决我的问题.

我们有一个使用xml配置的模板配置,但现在我们正试图摆脱它并开始使用Java配置.

所以我有一个使用Java配置和Spring Boot的新项目.我们也使用JSP和Tiles 3.

问题是:它无法呈现我们的管理员登录页面.

这是代码:

主配置类:

@SpringBootApplication
@EnableScheduling
@Import(OnAdminBeans.class)
public class AppConfig extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(AppConfig.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(AppConfig.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

AppConfig.class是主要的包.通过@ComponentScan@SpringBootApplication,它会扫描其他配置mainpackage.config,因此它会导入视图配置类:

@Configuration
@EnableWebMvc
public class ViewConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/adm/static/**").addResourceLocations("/adm/static/");
    }

//  @Override
//  public void addViewControllers(ViewControllerRegistry registry) {
//      registry.addViewController("/adm/login").setViewName("login-template-tiles");
//  }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.viewResolver(viewResolver()); …
Run Code Online (Sandbox Code Playgroud)

java spring spring-mvc spring-boot spring-java-config

11
推荐指数
2
解决办法
4万
查看次数

如何使用JavaConfig从Spring Security中删除ROLE_前缀?

我正在尝试删除Spring Security中的"ROLE_"前缀.我尝试的第一件事是:

http.servletApi().rolePrefix("");
Run Code Online (Sandbox Code Playgroud)

这没用,所以我尝试BeanPostProcessorhttp://docs.spring.io/spring-security/site/migrate/current/3-to-4/html5/migrate-3-to-4-中的建议创建一个jc.html#m3to4-role-prefixing-disable.那也行不通.

最后,我尝试创建自己的SecurityExpressionHandler:

  @Override
  protected void configure(HttpSecurity http) throws Exception {
      http
          .authorizeRequests()
          .expressionHandler(webExpressionHandler())
          .antMatchers("/restricted").fullyAuthenticated()
          .antMatchers("/foo").hasRole("mycustomrolename")
          .antMatchers("/**").permitAll();
  }

  private SecurityExpressionHandler<FilterInvocation> webExpressionHandler() {
      DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
      defaultWebSecurityExpressionHandler.setDefaultRolePrefix("");
      return defaultWebSecurityExpressionHandler;
  }
Run Code Online (Sandbox Code Playgroud)

但是,这也不起作用.如果我使用"hasAuthority(roleName)"而不是hasRole,它按预期工作.

是否可以从Spring Security的hasRole检查中删除ROLE_前缀?

spring spring-security spring-java-config

11
推荐指数
5
解决办法
1万
查看次数