Spring Security - bean类的属性'principal'无效[org.springframework.security.authentication.UsernamePasswordAuthenticationToken]

时间:2012-09-21 12:42:25

标签: spring-security principal

我必须为项目实现自定义“身份验证提供程序”,但在尝试访问JSP中的身份验证对象属性时遇到了麻烦。细节: 我的自定义身份验证提供程序成功创建了身份验证对象

Authentication auth = new UsernamePasswordAuthenticationToken(username, password, getAuthorities(userRoles));
log.info("User is authenticated");
return auth;

(这里只有相关代码)

然后,在控制器方法中,我只显示带有用户名的日志消息(这证明创建了Authentication对象并将其置于安全上下文中):

Authentication auth = SecurityContextHolder.getContext().getAuthentication();        
log.info("Welcoming user " + auth.getPrincipal());

然后在JSP页面中,我想使用

显示用户名
<sec:authentication property="principal"/>

但是,这会引发错误500:

org.springframework.beans.NotReadablePropertyException: Invalid property 'principal' of bean class [org.springframework.security.authentication.UsernamePasswordAuthenticationToken]: Bean property 'principal' is not readable...

我也注意到了

<sec:authorize ifAnyGranted="role">...

不起作用,尽管用户在Authentication对象中添加了必要的角色。

我有什么问题吗?身份验证工作正常,我只是无法访问身份验证对象的属性。

非常感谢你,祝你有个美好的一天。

3 个答案:

答案 0 :(得分:2)

您的AuthenticationProvider必须返回UserDetails对象。

从春季文档 此标记允许访问存储在安全上下文中的当前Authentication对象。它直接在JSP中呈现对象的属性。因此,例如,如果Authentication的principal属性是Spring Security的UserDetails对象的实例,则using将呈现当前用户的名称。

答案 1 :(得分:1)

鉴于我看不出你的情况有什么问题,我认为它可能是SPR-8347 bug,这在Spring 3.1.1中得到修复。你能升级吗?

答案 2 :(得分:0)

老问题,但我认为我可以帮助其他人。

作为UsernamePasswordAuthenticationToken的第一个参数,您可以发送用户。

不是传递用户名,而是传递用户自己。但是用户必须是扩展org.springframework.security.core.userdetails.UserDetails的类:

Authentication auth = new UsernamePasswordAuthenticationToken(user, password, getAuthorities(userRoles));
log.info("User is authenticated");
return auth;

请参阅您正在使用的方法:

public UsernamePasswordAuthenticationToken(Object principal, Object credentials,
            Collection<? extends GrantedAuthority> authorities) {
        super(authorities);
        this.principal = principal;
        this.credentials = credentials;
        super.setAuthenticated(true); // must use super, as we override
    }

现在,在你的tamplete中,你可以使用这样的东西:

<span class="hidden-sm-down" sec:authentication="principal.email">Email</span>