我为我的web应用程序使用spring security 3.1。Spring Security 3.1 - 如何识别用户已经登录或不是?
我已经实现了我的自定义过滤器来提供所请求URL的过滤。
用户登录后,用户点击登录URL,此时登录URL不应该被打开。我的意思是说我如何检查用户是否已经登录?
如果用户已经登录,则不应打开登录页面。它应该打开default-target-url页面。
谢谢。
我为我的web应用程序使用spring security 3.1。Spring Security 3.1 - 如何识别用户已经登录或不是?
我已经实现了我的自定义过滤器来提供所请求URL的过滤。
用户登录后,用户点击登录URL,此时登录URL不应该被打开。我的意思是说我如何检查用户是否已经登录?
如果用户已经登录,则不应打开登录页面。它应该打开default-target-url页面。
谢谢。
您可以使用SecurityContextHolder类中的静态方法从Security Context 获得Authentication对象,然后您可以找到用户当前是否已登录。
试试这个:
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null) {
//not authorized
}
Object principalObject = authentication.getPrincipal();
if (principalObject == null) {
//not authorized
}
或者你可以配置安全,我认为这是你在你的applicationContext需要的东西:
<security:http auto-config="true" authentication-manager-ref="authenticationManager">
<!-- Don't set any role restrictions on login.jsp and index.jsp -->
<security:intercept-url pattern="/login"
access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<security:intercept-url pattern="/urlOfAView"
access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<!-- Restrict access to ALL other pages -->
<security:intercept-url pattern="/**" access="ROLE_USER"/>
<!-- Set the login page and what to do if login fails -->
<security:form-login login-page="/login"
authentication-failure-url="/login?login_error=1" default-target-url="/loginUser"/>
<!-- Set the logout page and where to go after logout is successful -->
<security:logout logout-success-url="/index"/>
</security:http>
我使用Spring 3.1,所以我的命名空间:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
">
祝你好运
感谢您的回答。 但我的问题是,如果用户已经登录,则不应显示登录页面。应显示登录页面主页面(登录页面后)。 所以请帮助我解决这个问题,如果可能的话,使用preauthentication过滤器。 谢谢。 – 2012-03-12 07:06:31
我更新了我的答案。如果您将配置添加到应用程序上下文中,那么当您访问索引页时,spring会检查您是否已通过身份验证。如果你不是,它会将你重定向到登录页面。您还可以看到:[安全命名空间配置](http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config。html) – 2012-03-12 08:42:01
感谢您的回复。 但我想它也是副诗。我的意思是说,如果用户已经登录,那么登录页面将不会被打开,但目标网址将被打开。 谢谢。 – 2012-03-15 13:13:50
我正在寻找一个解决方案,以完全相同的问题。我结束了以下工作:
@RequestMapping(method = RequestMethod.GET, value = "/admin/login")
public ModelAndView login(HttpServletRequest request) {
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if(principal instanceof UserDetails && validLogin((UserDetails) principal)){
return new ModelAndView("redirect:/admin/home"); // Go to admin home if already
// logged in
}
final String error = request.getParameter("login_error");
return loginPage.display(error); // Not logged in, so admin login page is displayed
}
private boolean validLogin(UserDetails userDetails) {
// This function does a check to ascertain the validity of the logged in user
// You may also consider evaluating userDetails.getAuthorities()
return userDetails.isAccountNonExpired() &&
userDetails.isAccountNonLocked() &&
userDetails.isCredentialsNonExpired() &&
userDetails.isEnabled();
}
但我当然希望有一个更可配置的方式来实现这一点。
我现在正在编写类似的功能。在我来说,我只是添加了此代码与Spring的安全配置:当然
<http pattern="/**" auto-config="false" use-expressions="true" >
<intercept-url pattern="/login" access="!isAuthenticated()" />
<access-denied-handler error-page="/"/>
<!-- More configuration here -->
</http>
的这种配置会将所有“拒绝访问”请求您的主页。如果你只想为你的登录页面使用不同的重定向,你应该提供你自己的访问拒绝处理程序实现。
感谢您的回答。 但我的问题是,如果用户已经登录,则不应显示登录页面。应显示登录页面主页面(登录页面后)。 所以请帮助我解决这个问题,如果可能的话,使用preauthentication过滤器。 谢谢。 – 2012-03-12 07:06:38