这是我的主控制器:
package org.demian.demibox.controllers;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class MainController {
private String getUsername() {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth.isAuthenticated())
return auth.getName();
else
return null;
}
@RequestMapping(value = "/", method = RequestMethod.GET)
public String showHome() {
String username = getUsername();
System.out.println(username);
if (username == null || username.length() == 0)
return "welcome";
return "index";
}
}
即使我没有登录,也auth.isAuthenticated()
总是返回true
。这是为什么?而何时会auth.isAuthenticated()
返回false?anonymousUser
如果我未登录,则经过身份验证的用户的名称是;如果我登录,则为用户名。
这是我的security-context.xml
文件:
<?xml version="1.0" encoding="UTF-8"?>
<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.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<security:authentication-manager>
<security:authentication-provider>
<security:jdbc-user-service data-source-ref="dataSource" id="jdbcUserService" />
<!-- <security:password-encoder ref="passwordEncoder" /> -->
</security:authentication-provider>
</security:authentication-manager>
<security:http use-expressions="true">
<security:intercept-url pattern="/" access="permitAll" />
<security:intercept-url pattern="/login" access="permitAll" />
<security:intercept-url pattern="/redeem" access="permitAll" />
<security:intercept-url pattern="/redeem_code" access="permitAll" />
<security:intercept-url pattern="/static/**" access="permitAll" />
<security:intercept-url pattern="/*" access="isAuthenticated()" />
<security:intercept-url pattern="/**" access="isAuthenticated()" />
<security:intercept-url pattern="/**" access="denyAll" />
<security:form-login login-page="/login" authentication-failure-url="/login?error=true" />
<security:logout logout-success-url="/" />
<security:remember-me key="offersAppKey" user-service-ref="jdbcUserService" />
</security:http>
<security:global-method-security secured-annotations="enabled" />
<!-- <bean id="passwordEncoder" class="org.springframework.security.crypto.password.StandardPasswordEncoder" /> -->
</beans>
web.xml
文件中包含以下几行:
<filter>
<display-name>springSecurityFilterChain</display-name>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我正在通过Maven使用Tomcat 8.0和所有最新的依赖项。
默认情况下,这就是spring-security的工作方式。
从文档:
注意,“匿名认证”的用户和未经认证的用户之间没有真正的概念差异。Spring Security的匿名身份验证只是为您提供了一种更便捷的方式来配置访问控制属性。
getCallerPrincipal
即使确实存在匿名身份验证对象,对Servlet API调用的调用(例如)仍将返回nullSecurityContextHolder
。在其他情况下,匿名身份验证很有用,例如,当审核拦截器查询时,
SecurityContextHolder
以标识哪个主体负责给定操作。如果类知道SecurityContextHolder
总是包含一个Authentication
对象且从不为null,则可以更强大地编写类。
如果需要检查是否为,anonymousUser
则可以检查Authentication
对象是否为AnonymousAuthenticationToken
实例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句