我的Web安全配置中包含以下代码:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/**")
.hasRole("ADMIN")
.and()
.httpBasic().and().csrf().disable();
}
因此,我在数据库中添加了一个具有“ ADMIN”角色的用户,并且尝试与此用户登录时总是收到403错误,然后为spring启用了日志功能,并发现以下行:
2019-10-18 23:13:24.112 DEBUG 4899 --- [nio-8080-exec-1] o.s.s.w.a.i.FilterSecurityInterceptor : Secure object: FilterInvocation: URL: /api/user/login; Attributes: [hasRole('ROLE_ADMIN')]
为什么Spring Security在寻找“ ROLE_ADMIN”而不是“ ADMIN”?
在Spring 4中,有两个方法,hasAuthority()
并且hasAnyAuthority()
在org.springframework.security.access.expression.SecurityExpressionRoot
类中定义。这两种方法仅检查你的自定义角色名称,而不添加ROLE_
前缀。定义如下:
public final boolean hasAuthority(String authority) {
return hasAnyAuthority(authority);
}
public final boolean hasAnyAuthority(String... authorities) {
return hasAnyAuthorityName(null, authorities);
}
private boolean hasAnyAuthorityName(String prefix, String... roles) {
Set<String> roleSet = getAuthoritySet();
for (String role : roles) {
String defaultedRole = getRoleWithDefaultPrefix(prefix, role);
if (roleSet.contains(defaultedRole)) {
return true;
}
}
return false;
}
private static String getRoleWithDefaultPrefix(String defaultRolePrefix, String role) {
if (role == null) {
return role;
}
if (defaultRolePrefix == null || defaultRolePrefix.length() == 0) {
return role;
}
if (role.startsWith(defaultRolePrefix)) {
return role;
}
return defaultRolePrefix + role;
}
用法示例:
<http auto-config="false" use-expressions="true" pattern="/user/**"
entry-point-ref="loginUrlAuthenticationEntryPoint">
<!--If we use hasAnyAuthority, we can remove ROLE_ prefix-->
<intercept-url pattern="/user/home/yoneticiler" access="hasAnyAuthority('FULL_ADMIN','ADMIN')"/>
<intercept-url pattern="/user/home/addUser" access="hasAnyAuthority('FULL_ADMIN','ADMIN')"/>
<intercept-url pattern="/user/home/addUserGroup" access="hasAuthority('FULL_ADMIN')"/>
<intercept-url pattern="/user/home/deleteUserGroup" access="hasAuthority('FULL_ADMIN')"/>
<intercept-url pattern="/user/home/**" access="hasAnyAuthority('FULL_ADMIN','ADMIN','EDITOR','NORMAL')"/>
<access-denied-handler error-page="/403"/>
<custom-filter position="FORM_LOGIN_FILTER" ref="customUsernamePasswordAuthenticationFilter"/>
<logout logout-url="/user/logout"
invalidate-session="true"
logout-success-url="/user/index?logout"/>
<!-- enable csrf protection -->
<csrf/>
</http> <beans:bean id="loginUrlAuthenticationEntryPoint"
class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
<beans:constructor-arg value="/user"/>
</beans:bean>
我的Web安全配置中有以下代码: 因此,我在数据库中添加了一个具有“admin”角色的用户,当我使用该用户进行登录时,总是会出现403错误,然后我启用了spring的log,并发现了这一行: 为什么Spring Security要查找“role_admin”而不是“admin”?
我的Web安全配置中有以下代码: 因此,我在我的数据库中添加了一个具有“ADMIN”角色的用户,当我尝试使用该用户登录时,总是出现403错误,然后我为spring启用了日志,我发现了以下行: 为什么Spring Security要寻找“ROLE_ADMIN”而不是“ADMIN”?
在千分尺中,我们可以创建一个新的量规,类似于 见此处代码https://github . com/micrometer-metrics/micrometer/blob/master/micrometer-core/src/main/Java/io/micrometer/core/instrument/meter registry . Java # L468 是否可以默认为我的对象包含“前缀”名称?
问题内容: 我有一个前缀要添加到每条路线。现在,我在每个定义处都向路线添加了一个常量。有没有一种方法可以自动执行此操作? 问题答案: 答案取决于你如何为该应用程序提供服务。 安装在另一个WSGI容器中 假设你将在WSGI容器(mod_wsgi,uwsgi,gunicorn等)中运行此应用程序;你实际上需要将该应用程序作为该WSGI容器的子部分挂载在该前缀处(任何讲WSGI的东西都可以使用),并将A
问题内容: 我正在开发一个项目,其中通过添加Hibernate批注来保留一些POJO。我遇到的一个问题是,这样的代码失败了,因为Hibernate尝试将内的子字段映射到同一列上(即,两者都试图映射到colum ,从而导致错误)。 由于会有很多出现这样在整个系统中,这将是很好,如果有一个选项来自动添加一个前缀列的名称(例如使列是,,,),而不必基于每个应用覆盖领域基础。Hibernate是否具有此功
问题内容: 我有一个前缀要添加到每条路线。现在,我在每个定义处都向路线添加了一个常量。有没有一种方法可以自动执行此操作? 问题答案: 答案取决于你如何为该应用程序提供服务。 子安装在另一个容器中 假设你将在容器(等)中运行此应用程序;你实际上需要将该应用程序作为该容器的子部分挂载在该前缀处(任何讲WSGI的东西都可以使用),并将值设置为你的前缀: 设置配置值只是将的会话限制为该URL前缀。和出色的