SpringSecurity hasRole()的原理(拼装ROLE_与不拼装ROLE_的效果相同) 作者:马育民 • 2020-08-04 22:00 • 阅读:10280 # 介绍 在配置类中,url的权限控制方法`hasRole()`和`hasAnyRole()`,传入的角色字符串,前面拼装`ROLE_`与不拼装`ROLE_`的效果相同 **原因是:** 在`SecurityExpressionRoot`类中,做了处理,关键代码 ### 定义前缀 ``` private String defaultRolePrefix = "ROLE_"; ``` ### hasRole()、hasAnyRole()源码 ``` public final boolean hasRole(String role) { return this.hasAnyRole(role); } public final boolean hasAnyRole(String... roles) { return this.hasAnyAuthorityName(this.defaultRolePrefix, roles); } private boolean hasAnyAuthorityName(String prefix, String... roles) { Set roleSet = this.getAuthoritySet(); String[] var4 = roles; int var5 = roles.length; for(int var6 = 0; var6 < var5; ++var6) { String role = var4[var6]; String defaultedRole = getRoleWithDefaultPrefix(prefix, role); if (roleSet.contains(defaultedRole)) { return true; } } return false; } ``` 调用`hasRole()`方法,就是在调用`hasAnyRole()`方法 调用`hasAnyRole()`方法,就是在调用`hasAnyAuthorityName()`方法,并传入了前缀 `getRoleWithDefaultPrefix()`方法源码如下,如果没有前缀`ROLE_`,就拼装上前缀`ROLE_`: ``` private static String getRoleWithDefaultPrefix(String defaultRolePrefix, String role) { if (role == null) { return role; } else if (defaultRolePrefix != null && defaultRolePrefix.length() != 0) { return role.startsWith(defaultRolePrefix) ? role : defaultRolePrefix + role; } else { return role; } } ``` # 总结: 所以,`hasRole()`和`hasAnyRole()`,传入的角色字符串,前面拼装`ROLE_`与不拼装`ROLE_`的效果相同 原文出处:http://malaoshi.top/show_1EF60v8dUrCp.html