我有一个使用Spring Security的Spring MVC Web应用程序.我想知道当前登录用户的用户名.我正在使用下面给出的代码段.这是接受的方式吗?
我不喜欢在这个控制器中调用静态方法 - 这违背了Spring的全部目的,恕我直言.有没有办法配置应用程序以注入当前的SecurityContext或当前的身份验证?
@RequestMapping(method = RequestMethod.GET)
public ModelAndView showResults(final HttpServletRequest request...) {
final String currentUser = SecurityContextHolder.getContext().getAuthentication().getName();
...
}
Run Code Online (Sandbox Code Playgroud) 从ThreadLocal
变量读取多少比常规字段慢?
更具体地说,简单的对象创建比访问ThreadLocal
变量更快还是更慢?
我认为它足够快,因此ThreadLocal<MessageDigest>
实例比MessageDigest
每次创建实例要快得多.但这也适用于字节[10]或字节[1000]吗?
编辑:问题是在调用ThreadLocal
get 时真正发生的事情?如果那只是一个领域,就像任何其他领域一样,那么答案就是"它总是最快",对吧?
我是Java和Spring 3的新手(过去8年主要使用PHP).我已经获得了spring security 3来使用所有默认的userDetails和userDetailsService,我知道我可以使用以下命令访问控制器中登录用户的用户名:
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String username = auth.getName(); //get logged in username
Run Code Online (Sandbox Code Playgroud)
但有两个问题我无法弄清楚:
当用户登录时,我希望存储许多其他用户详细信息(例如DOB,性别等),并且稍后可以通过控制器访问.我需要做什么才能创建的userDetails对象包含我的自定义字段?
我已经调用了"HttpSession session = request.getSession(true);" 在我的控制器中的每个方法的顶部.是否可以在登录时将登录用户的userDetails存储在会话中,这样我就不需要再调用"Authentication auth = SecurityContextHolder.getContext().getAuthentication();" 在每个方法的开头?
安全applicationContext.xml中:
<global-method-security secured-annotations="enabled"></global-method-security>
<http auto-config='true' access-denied-page="/access-denied.html">
<!-- NO RESTRICTIONS -->
<intercept-url pattern="/login.html" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<intercept-url pattern="/*.html" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<!-- RESTRICTED PAGES -->
<intercept-url pattern="/admin/*.html" access="ROLE_ADMIN" />
<intercept-url pattern="/member/*.html" access="ROLE_ADMIN, ROLE_STAFF" />
<form-login login-page="/login.html"
login-processing-url="/loginProcess"
authentication-failure-url="/login.html?login_error=1"
default-target-url="/member/home.html" />
<logout logout-success-url="/login.html"/>
</http>
<authentication-manager>
<authentication-provider>
<jdbc-user-service data-source-ref="dataSource" authorities-by-username-query="SELECT U.username, UR.authority, U.userid FROM users U, userroles UR …
Run Code Online (Sandbox Code Playgroud)