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

用Spring Security性保护REST Api

易扬
2023-03-14

我是Spring Security的新手,我正在尝试在我的应用程序中保护REST api。我有应用程序URI,然后我有一个类似于“/api/v1/”的URI到我的rest api。

我已经用用户名/密码身份验证保护了我的应用程序,它工作正常,但现在我想保护我的REST api,如果用户未经身份验证,则返回401未授权,但我不知道如何将这两种身份验证保持在一起。

这里的路是什么?

PS:我用的是Spring MVC和Spring Security

这是我现在的 Spring 安全配置:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private AccountService accountService;

    @Bean
    public TokenBasedRememberMeServices rememberMeServices() {
        return new TokenBasedRememberMeServices("remember-me-key", accountService);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new StandardPasswordEncoder();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.eraseCredentials(true).userDetailsService(accountService).passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/", "/favicon.ico", "/resources/**", "/signup").permitAll().anyRequest()
                .authenticated()
                .and().formLogin().loginPage("/signin").permitAll().failureUrl("/signin?error=1")
                .loginProcessingUrl("/authenticate")
                .and().logout().logoutUrl("/logout").permitAll().logoutSuccessUrl("/signin?logout")
                .and().rememberMe().rememberMeServices(rememberMeServices()).key("remember-me-key")
                .and().csrf();
    }

    @Bean(name = "authenticationManager")
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

共有2个答案

宰父飞白
2023-03-14

您可以使用基于表达式的访问控制http://docs . spring . io/spring-security/site/docs/3.0 . x/reference/El-access . html

比如,

<intercept-url pattern=/** access="isFullyAuthenticated()/>
皮景龙
2023-03-14

所以你想要表单登录加上安全rest api,对吗?

jhipster可以生成这样的项目结构。如果您不想使用jhipster,让我给出一些实现这一点的示例代码(我建议您使用它)

要为未经授权的退回401,您需要如下内容:

/**
 * Returns a 401 error code (Unauthorized) to the client.
 */
@Component
public class Http401UnauthorizedEntryPoint implements AuthenticationEntryPoint {

    private final Logger log = LoggerFactory.getLogger(Http401UnauthorizedEntryPoint.class);

    /**
     * Always returns a 401 error code to the client.
     */
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException arg2)
        throws IOException,
        ServletException {

        log.debug("Pre-authenticated entry point called. Rejecting access");
        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Access Denied");
    }
}

然后注入并将其添加到SecurityConfig.config(HttpSecurityhttp)方法中:

http.authenticationEntryPoint(authenticationEntryPoint)

另外,因为REST请求是ajax请求,所以您还需要ajax入口点:

/**
 * Returns a 401 error code (Unauthorized) to the client, when Ajax authentication fails.
 */
@Component
public class AjaxAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {

    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
        AuthenticationException exception) throws IOException, ServletException {

        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Authentication failed");
    }
}


/**
 * Spring Security success handler, specialized for Ajax requests.
 */
@Component
public class AjaxAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
        Authentication authentication)
        throws IOException, ServletException {

        response.setStatus(HttpServletResponse.SC_OK);
    }
}

/**
 * Spring Security logout handler, specialized for Ajax requests.
 */
@Component
public class AjaxLogoutSuccessHandler extends AbstractAuthenticationTargetUrlRequestHandler
    implements LogoutSuccessHandler {

    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response,
        Authentication authentication)
        throws IOException, ServletException {
        response.setStatus(HttpServletResponse.SC_OK);
    }
}

将它们也添加到安全配置中:

http.successHandler(ajaxAuthenticationSuccessHandler)
    .failureHandler(ajaxAuthenticationFailureHandler)
    .logoutSuccessHandler(ajaxLogoutSuccessHandler)

所有的功劳都归功于令人惊叹的杰普斯特作家。

 类似资料:
  • 本文向大家介绍如何使用SpringSecurity保护程序安全,包括了如何使用SpringSecurity保护程序安全的使用技巧和注意事项,需要的朋友参考一下 首先,引入依赖: 引入此依赖之后,你的web程序将拥有以下功能: 所有请求路径都需要认证 不需要特定的角色和权限 没有登录页面,使用HTTP基本身份认证 只有一个用户,名称为user 配置SpringSecurity springsecur

  • 启用触摸保护 把 Yubikey-manager 安装在一个绝对路径:【译者注:homebrew 是 macOS 平台的包管理软件】 ❯ brew install libu2f-host libusb swig ykpers ❯ git clone git@github.com:Yubico/Yubikey-manager.git ❯ git submodule update --init --r

  • 我的Java应用程序中有多个用户角色。下面是我的代码: 错误: 因此,所发生的情况是,它加载了用户数据的URL访问权限,但当执行最后一行时,它将/dashboard URL更改为具有ADMIN访问权限。我的角色仍然是数据角色,因此不能访问/dashboard URL。 最后一行似乎覆盖了其他行。再来看看URL特权,如果我删除“/dashboard”,那么当涉及到“/data”URL时,我会得到同样

  • 在这种情况下,我的问题是知道mcauser属性是否只适用于MQI通道,如svrconn、clusrcvr等,还是同时适用于这两类通道。如果是,那么为什么没有阻止到接收者通道的连接,就像在尝试clusrcvr通道和svrconn时,如果我将mcauser属性设置为'NOAccess',它将阻止用户,直到我没有为相同的属性设置任何chlauth。但是当我试图将接收方通道的属性设置为“noaccess”

  • 问题内容: 我正在使用基于Node.js的https服务器,该服务器使用HTTP Basic进行身份验证(这很好,因为数据是通过SSL加密连接发送的)。 现在我想提供一个Socket.io连接 加密和 仅适用于经过身份验证的用户。 问题是如何做到这一点。我已经发现在连接到套接字时需要在客户端JavaScript代码中指定,但是如何在服务器端强制套接字连接只能在SSL上运行,并且仅适用于经过身份验证

  • 问题内容: JKS(Java密钥存储)文件是否已加密?它们是否为加密密钥提供全面保护,还是我仅需要依赖访问控制? 有没有办法确保密钥受到保护? 我对详细的细节感兴趣,包括算法,密钥管理等。这些可配置的任何一个吗? 问题答案: 它们已加密。 该算法取决于提供者。提供者将根据密码返回密钥/证书。如果需要强安全性,请找到使用强加密的密钥库提供程序。

  • 简介 Laravel 可以轻松地保护应用程序免受 跨站点请求伪造 (CSRF) 攻击,跨站点请求伪造是一种恶意攻击,它凭借已通过身份验证的用户身份来运行未经过授权的命令。 Laravel 会自动为每个活跃用户的会话生成一个 CSRF「令牌」。该令牌用于验证经过身份验证的用户是否是向应用程序发出请求的用户。 无论何时,当您在应用程序中定义HTML表单时,都应该在表单中包含一个隐藏的CSRF标记字段,

  • 问题内容: 有什么办法可以实现安全的FTP ? 如果没有,那么Java还有哪些其他选择? 问题答案: 您可以使用org.apache.commons.net.ftp。 FTPSClient, 而不是org.apache.commons.net.ftp。 FTPClient 具有安全的ftp http://commons.apache.org/proper/commons- net/apidocs/