我使用GitHub中的示例项目创建了一个Web应用程序。但是,它要求所有粗粒操作都进行身份验证。我想限制所有读取数据库操作的安全检查。我需要什么更改?
这些是相关的类:
protected void configure(HttpSecurity http) throws Exception {
http
.cors()
.and()
.csrf()
.disable()
.exceptionHandling()
.authenticationEntryPoint(unauthorizedHandler)
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/",
"/favicon.ico",
"/**/*.png",
"/**/*.gif",
"/**/*.svg",
"/**/*.jpg",
"/**/*.html",
"/**/*.css",
"/**/*.js")
.permitAll()
.antMatchers("/api/auth/**")
.permitAll()
.antMatchers("/api/user/checkUsernameAvailability", "/api/user/checkEmailAvailability")
.permitAll()
.antMatchers(HttpMethod.GET, "/api/polls/**", "/api/users/**")
.permitAll()
.anyRequest()
.authenticated();
// Add our custom JWT security filter
http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
}
}
答案 0 :(得分:2)
据我所知,没有办法神奇地创建只读用户。但是,您可以创建诸如ROLE_UPDATE
之类的角色,并通过执行来保护执行创建/更新/删除操作的所有方法。 @Secured("ROLE_UPDATE")
。然后,如果未授予用户ROLE_UPDATE
权限,则他们将无法调用任何“写入”方法,因此将仅限于调用“读取”方法。
答案 1 :(得分:1)
通常,Spring Security没有这种功能。您可以按照@Alien建议的方法创建角色(例如ROLE_WRITE
,然后检查资源是否正在尝试访问资源的用户具有正确的角色
@PreAuthorize("hasRole('ROLE_WRITE')")
public String someWriteOperation() {
}
另一种方法(但仅在JPA框架允许您使用此功能时才适用),它是在春季创建Filter
,然后在链中进一步处理您的请求之前,以只读方式创建事务:
@Component
@Order(1)
public class TransactionFilter implements Filter {
@Override
public void doFilterServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//Create read only transaction
// ex. if(isUserReadOnly(Security ....getUser())) {DBSession.setReadOnly(true);}
//Remember it will work only if your JPA framework have the feature - explore your code/framework before
chain.doFilter(request, response);
}
}
记住过滤器顺序应在Spring Security过滤器之后