我正在尝试使用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 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) 任何人都可以建议为什么我们需要使用静态方法声明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) 我正在尝试@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这是不可能的吗?
最近我将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) 我有一个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) 我在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)
但我找不到配置可跳过的异常类的方法
有什么区别
@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)
这在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) 我正在尝试删除Spring Security中的"ROLE_"前缀.我尝试的第一件事是:
http.servletApi().rolePrefix("");
Run Code Online (Sandbox Code Playgroud)
这没用,所以我尝试BeanPostProcessor按http://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_前缀?