为 Spring 安全性支持 "ROLE_" 前缀的最佳方式是什么?
What's the best way to support the "ROLE_" prefix for Spring Security?
如果您要支持没有所有角色前缀的旧应用程序,那么支持 "ROLE_" 前缀的最佳方法是什么?有没有办法在加载时忽略或省略它?
在正常的 spring 安全配置中似乎没有忽略前缀的简单方法。但是,我发现从数据库加载时,您可以轻松地将 "ROLE_" 附加到所有角色。我只是使用 MySQL 中的 CONCAT 函数将 "ROLE_" 添加到所有角色。见下文:
<authentication-manager>
<authentication-provider>
<password-encoder hash="md5"/>
<jdbc-user-service
data-source-ref="dataSource"
authorities-by-username-query="SELECT username, CONCAT('ROLE_', rolename) as authority FROM user_role WHERE active = 1 AND username = ?"
users-by-username-query="SELECT username, password, active FROM user WHERE username = ?" />
</authentication-provider>
</authentication-manager>
如果您使用 UserDetailsService 接口创建自己的 class,也可以应用此概念:
<!-- Select users and user_roles from database -->
<authentication-manager alias="authenticationManager">
<authentication-provider user-service-ref="myUserDetailsService">
<password-encoder ref="encoder" />
</authentication-provider>
</authentication-manager>
<beans:bean id="encoder" class="com.my.security.MyPasswordEncoder" />
注意:我使用 "alias" 作为 "authentication-manager" 而不是 ID,因为如果我覆盖默认 ID,我的自定义在身份验证过程中似乎会被忽略。
如果您要支持没有所有角色前缀的旧应用程序,那么支持 "ROLE_" 前缀的最佳方法是什么?有没有办法在加载时忽略或省略它?
在正常的 spring 安全配置中似乎没有忽略前缀的简单方法。但是,我发现从数据库加载时,您可以轻松地将 "ROLE_" 附加到所有角色。我只是使用 MySQL 中的 CONCAT 函数将 "ROLE_" 添加到所有角色。见下文:
<authentication-manager>
<authentication-provider>
<password-encoder hash="md5"/>
<jdbc-user-service
data-source-ref="dataSource"
authorities-by-username-query="SELECT username, CONCAT('ROLE_', rolename) as authority FROM user_role WHERE active = 1 AND username = ?"
users-by-username-query="SELECT username, password, active FROM user WHERE username = ?" />
</authentication-provider>
</authentication-manager>
如果您使用 UserDetailsService 接口创建自己的 class,也可以应用此概念:
<!-- Select users and user_roles from database -->
<authentication-manager alias="authenticationManager">
<authentication-provider user-service-ref="myUserDetailsService">
<password-encoder ref="encoder" />
</authentication-provider>
</authentication-manager>
<beans:bean id="encoder" class="com.my.security.MyPasswordEncoder" />
注意:我使用 "alias" 作为 "authentication-manager" 而不是 ID,因为如果我覆盖默认 ID,我的自定义在身份验证过程中似乎会被忽略。