我正在开发我的第一个春季安全应用程序.我的applicationContext-security.xml文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Namespace-based OpenID configuration
-->
<b:beans xmlns="http://www.springframework.org/schema/security"
xmlns:b="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">
<http>
<intercept-url pattern="/**" access="ROLE_USER"/>
<intercept-url pattern="/index.xhtml*" filters="none"/>
<logout/>
<openid-login login-page="/index.xhtml" authentication-failure-url="/index.xhtml?login_error=true">
<attribute-exchange>
<openid-attribute name="email" type="http://schema.openid.net/contact/email" required="true" count="2"/>
<openid-attribute name="name" type="http://schema.openid.net/namePerson/friendly" />
</attribute-exchange>
</openid-login>
<remember-me token-repository-ref="tokenRepo"/>
</http>
<b:bean id="tokenRepo"
class="org.springframework.security.web.authentication.rememberme.InMemoryTokenRepositoryImpl" />
<authentication-manager alias="authenticationManager"/>
<user-service id="userService">
<user name="http://user.myopenid.com/" authorities="ROLE_SUPERVISOR,ROLE_USER" />
</user-service>
</b:beans>
Run Code Online (Sandbox Code Playgroud)
和Web.xml文件是:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
<display-name>Spring Security OpenID Demo Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext-security.xml
</param-value>
</context-param>
<context-param> …Run Code Online (Sandbox Code Playgroud) 我知道之前已经问过这个问题,但是我在这里遇到了一个特殊的问题.
我使用spring security 3.1.3.
我的Web应用程序中有3个可能的登录案例:
案例3)的问题是我无法将用户重定向到"产品"页面.无论如何,他们会在成功登录后重定向到主页.
请注意,对于案例2),成功登录后,重定向到受限页面的工作开箱即用.
这是我的security.xml文件的相关部分:
<!-- Authentication policy for the restricted page -->
<http use-expressions="true" auto-config="true" pattern="/restrictedPage/**">
<form-login login-page="/login/restrictedLogin" authentication-failure-handler-ref="authenticationFailureHandler" />
<intercept-url pattern="/**" access="isAuthenticated()" />
</http>
<!-- Authentication policy for every page -->
<http use-expressions="true" auto-config="true">
<form-login login-page="/login" authentication-failure-handler-ref="authenticationFailureHandler" />
<logout logout-url="/logout" logout-success-url="/" />
</http>
Run Code Online (Sandbox Code Playgroud)
我怀疑"每个页面的身份验证策略"都要对此问题负责.但是,如果我将其删除,我将无法再登录... j_spring_security_check发送404错误.
编辑:
感谢拉尔夫,我找到了解决方案.所以这就是事情:我使用了这个属性
<property name="useReferer" value="true"/>
Run Code Online (Sandbox Code Playgroud)
拉尔夫给我看了.之后我遇到了我的案例问题1):当通过登录页面登录时,用户停留在同一页面(并没有重定向到主页,就像以前一样).直到此阶段的代码如下:
<!-- Authentication policy for login page -->
<http use-expressions="true" auto-config="true" pattern="/login/**">
<form-login login-page="/login" authentication-success-handler-ref="authenticationSuccessHandlerWithoutReferer" />
</http>
<!-- Authentication policy for every …Run Code Online (Sandbox Code Playgroud) 是否有一个教程或有没有人指出如何使用Spring-Security执行以下操作?
任务:
我需要从我的数据库中获取用于验证用户名的salt并使用它来加密提供的密码(从登录页面)以将其与存储的加密密码(也称为用户验证)进行比较.
附加信息:
我使用自定义数据库结构.一个UserDetails对象是通过自定义创建UserDetailsService这反过来使用自定义DAOProvider来从数据库中获取信息.
我的security.xml文件到目前为止:
<authentication-manager>
<authentication-provider user-service-ref="userDetailsService">
</authentication-provider>
</authentication-manager>
Run Code Online (Sandbox Code Playgroud)
现在我想我需要
<password-encoder hash="sha" />
Run Code Online (Sandbox Code Playgroud)
还有什么?如何告诉spring security使用databaseprovided salt来编码密码?
编辑:
我发现这个SO帖子是信息性的,但还不够:如果我在我的xml中定义一个盐源来供密码编码器使用,如下所示:
<password-encoder ref="passwordEncoder">
<salt-source ref="saltSource"/>
</password-encoder>
Run Code Online (Sandbox Code Playgroud)
我将不得不编写一个自定义SaltSource来使用我的自定义盐.但是在UserDetails对象内部找不到.所以...
备选方案1:
我可以使用可能具有salt属性的UserDetails的自定义实现吗?
<beans:bean id="saltSource" class="path.to.MySaltSource"
p:userPropertyToUse="salt"/>
Run Code Online (Sandbox Code Playgroud)
和
@Service("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException, DataAccessException {
// ...
return buildUserFromAccount(account);
}
@Transactional(readOnly = true)
UserDetailsImpl buildUserFromAccount(Account account){
// ... build User object that contains salt property
} …Run Code Online (Sandbox Code Playgroud) 我正在使用Spring Security 3.0对LDAP服务器进行身份验证,我无法设法自己设置会话超时时间.我相信默认值是30分钟,但我需要将其设置为更长
我看到了使用@Order注释的代码.我想知道关于Spring Security或Spring MVC的这个注释有什么用处.
这是一个例子:
@Order(1)
public class StatelessAuthenticationSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private TokenAuthenticationService tokenAuthenticationService;
}
Run Code Online (Sandbox Code Playgroud)
如果我们不使用这个注释,上面提到的类的顺序会发生什么?
我有一个方法,我想允许匿名和经过身份验证的访问.
我正在使用基于java的配置的Spring Security 3.2.4.
重写的配置方法(在我的自定义配置类中扩展WebSecurityConfigurerAdapter)具有以下http块:
http
.addFilterBefore(muiltpartFilter, ChannelProcessingFilter.class)
.addFilterBefore(cf, ChannelProcessingFilter.class)
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.authorizeRequests()
.antMatchers("/ping**")
.permitAll()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login");
Run Code Online (Sandbox Code Playgroud)
ping请求处理程序和方法位于一个控制器中,该控制器也包含登录处理程序,它没有单独的@PreAuthorize或其他可能导致该问题的注释.
问题是匿名访问被拒绝,用户被重定向到登录页面.
记录调试级别,我看到Spring Security的以下反馈:
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] Secure object: FilterInvocation: URL: /ping; Attributes: [authenticated]
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] Previously Authenticated: org.springframework.security.authentication.AnonymousAuthenticationToken@6faad796: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@ffffa64e: RemoteIpAddress: 192.168.2.128; SessionId: 0EF6B13BBA5F00C020FF9C35A6E3FBA9; Granted Authorities: ROLE_ANONYMOUS
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.access.vote.AffirmativeBased] Voter: org.springframework.security.web.access.expression.WebExpressionVoter@123f2882, returned: -1
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.ExceptionTranslationFilter] Access is denied (user is anonymous); …Run Code Online (Sandbox Code Playgroud) 在Spring Security 4发布之后,它改进了对测试的支持,我想更新我当前的Spring security oauth2资源服务器测试.
目前,我有一个帮助器类,它OAuth2RestTemplate使用连接到实际ResourceOwnerPasswordResourceDetails的测试ClientId来设置一个使用,以便AccessTokenUri为我的测试请求一个有效的令牌.这个resttemplate然后用于在我的@WebIntegrationTests中发出请求.
我想通过利用Spring Security 4中的新测试支持,放弃对实际AuthorizationServer的依赖,并在我的测试中使用有效(如果有限)用户凭据.
到现在为止我都在尝试使用@WithMockUser,@WithSecurityContext,SecurityMockMvcConfigurers.springSecurity()和SecurityMockMvcRequestPostProcessors.*都没能进入通过身份验证的电话MockMvc,我找不到在Spring示例项目的任何这样的工作的例子.
任何人都可以帮助我使用某种模拟凭证来测试我的oauth2资源服务器,同时仍然测试所施加的安全限制吗?
**编辑**示例代码可在此处获取:https://github.com/timtebeek/resource-server-testing 对于每个测试类,我理解为什么它不能正常工作,但我正在寻找方法这将允许我轻松测试安全设置.
我现在正在考虑创建一个非常宽松的OAuthServer src/test/java,这可能会有所帮助.有没有人有任何其他建议?
我希望每个请求都能收到一些信息,所以我认为不是每个请求都有一个函数,而是单独从请求中获取这些信息,最好有一个过滤器.
因此,每个请求都应通过该过滤器,并获得我想要的.
问题是:如何编写自定义过滤器?
假设它不像任何预定义的弹簧安全过滤器,它是全新的.
我使用Spring Boot 1.0.2实现了一个REST服务器.我无法阻止Spring设置禁用HTTP缓存的HTTP标头.
我的控制器如下:
@Controller
public class MyRestController {
@RequestMapping(value = "/someUrl", method = RequestMethod.GET)
public @ResponseBody ResponseEntity<String> myMethod(
HttpServletResponse httpResponse) throws SQLException {
return new ResponseEntity<String>("{}", HttpStatus.OK);
}
}
Run Code Online (Sandbox Code Playgroud)
所有HTTP响应都包含以下标头:
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Expires: 0
Pragma: no-cache
Run Code Online (Sandbox Code Playgroud)
我已尝试以下方法删除或更改这些标头:
setCacheSeconds(-1)控制器.httpResponse.setHeader("Cache-Control", "max-age=123")控制器.@Bean返回值.WebContentInterceptorsetCacheSeconds(-1)spring.resources.cache-period为-1或正值application.properties.以上都没有任何影响.如何在Spring Boot中为所有或单个请求禁用或更改这些标头?
我使用Spring Boot和Spring Security以及Cors支持.
如果我执行以下代码
url = 'http://localhost:5000/api/token'
xmlhttp = new XMLHttpRequest
xmlhttp.onreadystatechange = ->
if xmlhttp.readyState is 4
console.log xmlhttp.status
xmlhttp.open "GET", url, true
# xmlhttp.setRequestHeader "X-Requested-With", "XMLHttpRequest"
xmlhttp.setRequestHeader 'Authorization', 'Basic ' + btoa 'a:a'
do xmlhttp.send
Run Code Online (Sandbox Code Playgroud)
我得到了结果
200
Run Code Online (Sandbox Code Playgroud)
如果我测试错误的凭据,如
url = 'http://localhost:5000/api/token'
xmlhttp = new XMLHttpRequest
xmlhttp.onreadystatechange = ->
if xmlhttp.readyState is 4
console.log xmlhttp.status
xmlhttp.open "GET", url, true
# xmlhttp.setRequestHeader "X-Requested-With", "XMLHttpRequest"
xmlhttp.setRequestHeader 'Authorization', 'Basic ' + btoa 'a:aa'
do xmlhttp.send
Run Code Online (Sandbox Code Playgroud)
而不是获得401(这是春季安全中错误身份验证的标准代码),我得到了
0
Run Code Online (Sandbox Code Playgroud)
以下浏览器通知:
获取http:// localhost:5000/api/token
XMLHttpRequest无法加载 …
spring-security ×10
spring ×7
java ×4
spring-boot ×2
spring-mvc ×2
annotations ×1
cors ×1
filter ×1
javascript ×1
login ×1
passwords ×1
redirect ×1
salt ×1