Spring自动登录拦截URL问题

时间:2011-03-24 12:51:18

标签: spring spring-security

我可以使用以下内容将用户存储在SecurityContext中,并且我获得了一个有效的Authentcation对象(说我已经过身份验证并附加了user_role)但是我仍然会被路由到我的/auth/login.html页面。我执行了下面的代码并将“/registered/home.html”返回给JSF,但出于某种原因,当Spring将拦截规则应用于/ registered / *时,它必须将其视为未经身份验证的请求。有什么想法吗?

@Named
    @Scope("request")
    public class SignUpDetail extends BaseAction{
        @Inject
        private SignUpDetailBean signUpDetailBean;
        @Inject
        private UserManager userManager;
        @Inject @Named("am")
        protected AuthenticationManager authenticationManager;

        public String login(){
            if(signUpDetailBean.getEmail() != null){
                Users currentUser = userManager.getUser(signUpDetailBean.getEmail());
                authenticateUserAndSetSession(currentUser, (HttpServletRequest) FacesUtils.getExternalContext().getRequest());

                return "/registered/home.html";
            }else{

                return "/auth/login.html";
            }

        }

     private void authenticateUserAndSetSession(Users user,
                    HttpServletRequest request)
                {
             UserDetails details = userManager.loadUserByUsername(user.getUsername());
             UsernamePasswordAuthenticationToken usernameAndPassword = 
                 new UsernamePasswordAuthenticationToken(
                     user.getUsername(), "pwd", details.getAuthorities());

             // Authenticate, just to be sure
             Authentication auth = authenticationManager.authenticate(usernameAndPassword);

             // Place the new Authentication object in the security context.
             SecurityContextHolder.getContext().setAuthentication(auth);
        }

<context:annotation-config />
    <context:component-scan base-package="dc" />
    <global-method-security />
    <http security="none" pattern="/javax.faces.resource/**" />
    <http security="none" pattern="/services/rest-api/1.0/**" />
    <http security="none" pattern="/preregistered/*" />
    <http access-denied-page="/auth/denied.html">
        <intercept-url
            pattern="/**/*.xhtml"
            access="ROLE_NONE_GETS_ACCESS" />
        <intercept-url
            pattern="/auth/**"
            access="ROLE_ANONYMOUS,ROLE_USER" />
         <intercept-url
            pattern="/auth/*"
            access="ROLE_ANONYMOUS" />
         <intercept-url
            pattern="/registered/*"
            access="ROLE_USER" />
          <intercept-url
            pattern="/*"
           access="ROLE_ANONYMOUS" />
        <form-login
            login-processing-url="/j_spring_security_check.html"
            login-page="/auth/login.html"
            default-target-url="/registered/home.html"
            authentication-failure-url="/auth/login.html" />
         <logout invalidate-session="true" 
              logout-success-url="/" 
              logout-url="/auth/logout.html"/>
        <anonymous username="guest" granted-authority="ROLE_ANONYMOUS"/>
        <remember-me user-service-ref="userManager" key="dfdf"/>
    </http>
    <!-- Configure the authentication provider -->
    <authentication-manager alias="am">
        <authentication-provider user-service-ref="userManager">
                <password-encoder ref="passwordEncoder" />
        </authentication-provider>
    </authentication-manager>

1 个答案:

答案 0 :(得分:1)

将上下文对象存储在会话中,因为您已将该特定URL http安全性设置为无

...
HttpSession session = request.getSession();
...
SecurityContext context = SecurityContextHolder.getContext();
context.setAuthentication(auth);
session.setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, context);