以下是我对使用SpringBoot制作的API的单一安全配置:
@Configuration
@EnableWebSecurity
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserService userService;
@Autowired
private TokenAuthenticationService tokenAuthenticationService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/static/**").permitAll()
.antMatchers(HttpMethod.POST, "/api/user/registration").permitAll()
.antMatchers(HttpMethod.POST, "/api/user/authentication").permitAll()
.anyRequest().authenticated().and()
.addFilterBefore(new TokenLoginFilter("/api/user/authentication", authenticationManagerBean(), tokenAuthenticationService),
UsernamePasswordAuthenticationFilter.class)
.addFilterBefore(new TokenAuthenticationFilter(tokenAuthenticationService),UsernamePasswordAuthenticationFilter.class);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService).passwordEncoder(new BCryptPasswordEncoder());
}
}
所有URL都映射到Spring Web mvc控制器,我想手动指定控制器的访问级别及其方法,如下所示:
@RestController
@RequestMapping("/api/resource/")
@Secured("ROLE_ANONYMOUS") //as default role
public class ResourceController {
...
@Secured("ROLE_USER")
some_method...
}
但是当我以匿名用户身份执行 /api/resource/*请求时,应用程序会响应403状态码,但我希望调用方法。看起来@安全注释对授权没有影响,所有控制器方法只允许ROLE_USER。
令牌认证过滤器仅在令牌存在时才执行操作,所以我想它没有效果。
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) req;
String token = httpServletRequest.getHeader(TokenAuthenticationService.AUTH_HEADER_NAME);
if (token != null) {
try {
SecurityContextHolder.getContext()
.setAuthentication(tokenAuthenticationService.verifyToken(new TokenAuthentication(token)));
} catch (AuthenticationException e) {
((HttpServletResponse) res).setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return;
}
}
chain.doFilter(req, res);
}
更新时间:
考虑到这个问题下面的评论,我意识到@安全注释是全局方法安全概念的一部分,而不是Web安全的一般部分。现在我有以下权衡:
>
使用@安全注释,并使方法访问级别信息分布在控制器类上,这可能会导致在API增长的情况下无法确定fufture中的方法访问级别。
将所有方法访问信息保持在同一位置(config),但必须支持@RequestMapping值与config中的URL相等。
你认为哪一个是最好的方法,或者如果我错过了什么,请告诉我?
为了告诉Spring监视@Secured annotation,您必须在安全配置中添加以下内容:
@EnableGlobalMethodSecurity(securedEnabled = true)
我在测试使用Play的CSRF保护的控制器时遇到了一些问题。为了演示这一点,我创建了一个非常简单的Play应用程序,它可以将问题最小化。 https://github.com/adamnfish/csrftest 完整的详细信息在该存储库的自述中,但在此进行总结: 考虑设计用于处理表单提交的控制器。它有一个使用CSRFAddToken的GET方法和一个使用CSRFCheck的POST方法。前者向请
有人能给我提供一个代码示例来编写用HTTPS保护的控制器的联调吗??使用HTTP我可以编写,但使用HTTPS我得到了认证错误。 控制器 测试类别 错误 提前感谢
我正在使用Spring3.1并编写了我的DAO和服务层(事务性)。 但是,在一个特殊情况下,为了避免惰性初始化异常,我必须创建一个spring mvc请求处理程序method@transactional。但无法将事务附加到该方法。方法名为ModelAndView home(HttpServletRequest request、HttpServletResponse response)。http:/
问题内容: 我有以下代码: 这是我的控制者: 当我运行代码并调用/ api / Slide时,[Title]没有数据,并且为null。 如何将JSON发布到API控制器? 问题答案: 定义视图模型: 然后让您的控制器操作将此视图模型作为参数: 最后调用该动作: 原因是从URI绑定了诸如字符串之类的简单类型。我还邀请您阅读以下有关Web API中的模型绑定的文章。
给出了一种Spring-MVC控制器的方法: 如果请求URL中缺少参数,则报告一个错误,例如: JBWeb000068:message Required int参数“param1”不存在 如果省略,则可以执行此操作,但问题是,如果缺少参数,则不会报告任何错误。另一方面,如果包含,则在GET请求中需要一个名为“model”的参数。有没有一种方法可以使模型参数成为强制性的,同时保持相同的请求URL?
问题内容: 我知道这是不对的,但是为了说明起见,我想做这样的事情: 我的目标是制作一个HTML按钮,该按钮将调用我的MVC控制器的action方法。 问题答案: 除非您要张贴到操作中,否则根本不需要使用表格。输入按钮(不提交)可以解决问题。