当前位置: 首页 > 知识库问答 >
问题:

使用@Secured annotation保护MVC控制器方法

艾国安
2023-03-14

以下是我对使用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相等。

    你认为哪一个是最好的方法,或者如果我错过了什么,请告诉我?

  • 共有1个答案

    司徒光霁
    2023-03-14

    为了告诉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方法。 问题答案: 除非您要张贴到操作中,否则根本不需要使用表格。输入按钮(不提交)可以解决问题。