如何在具有 spring 安全性的代码中获取用户的授权凭据?
How to get user's authorization credentials in code with spring security?
我想做的是构建 CRUD REST 服务。它将维护一个用户及其记录的数据库。我想允许用户只能访问他们自己的记录。
我使用 Spring 安全性进行身份验证,并存储使用 Bcrypt 散列的用户密码。我现在能理解的是我的 spring-security.xml 应该像:
<security:http auto-config='true'>
<security:intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
<security:http-basic />
</security:http>
<security:authentication-manager>
<security:authentication-provider>
<authentication-provider>
<password-encoder ref="encoder" />
<jdbc-user-service data-source-ref="dataSource"
users-by-username-query="select username,password, enabled from users where username=?"
authorities-by-username-query="select username, role from user_roles where username =?" />
</authentication-provider>
</security:authentication-provider>
</security:authentication-manager>
但为了服务的进一步工作,我需要确切地知道哪个用户已被授权。那我该怎么做呢?对于相关问题,由于没有计划更多的角色,因此有办法绕过主线用户在数据库中的角色。
简单。
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String username = auth.getName();
Object credentials = auth.getCredentials();
要访问 凭据,即密码,您需要将 erase-credentials
设置为 false
:
<security:authentication-manager erase-credentials="false">
...
</security:authentication-manager>
或者如果通过注释配置则:
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.eraseCredentials(false);
/* configure user-service, password-encoder etc ... */
}
我想做的是构建 CRUD REST 服务。它将维护一个用户及其记录的数据库。我想允许用户只能访问他们自己的记录。 我使用 Spring 安全性进行身份验证,并存储使用 Bcrypt 散列的用户密码。我现在能理解的是我的 spring-security.xml 应该像:
<security:http auto-config='true'>
<security:intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
<security:http-basic />
</security:http>
<security:authentication-manager>
<security:authentication-provider>
<authentication-provider>
<password-encoder ref="encoder" />
<jdbc-user-service data-source-ref="dataSource"
users-by-username-query="select username,password, enabled from users where username=?"
authorities-by-username-query="select username, role from user_roles where username =?" />
</authentication-provider>
</security:authentication-provider>
</security:authentication-manager>
但为了服务的进一步工作,我需要确切地知道哪个用户已被授权。那我该怎么做呢?对于相关问题,由于没有计划更多的角色,因此有办法绕过主线用户在数据库中的角色。
简单。
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String username = auth.getName();
Object credentials = auth.getCredentials();
要访问 凭据,即密码,您需要将 erase-credentials
设置为 false
:
<security:authentication-manager erase-credentials="false">
...
</security:authentication-manager>
或者如果通过注释配置则:
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.eraseCredentials(false);
/* configure user-service, password-encoder etc ... */
}