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

将基于令牌的安全性集成到现有的Spring security web应用程序中

阎俊英
2023-03-14

我正在设计一个RESTful网络服务,需要用户在正确的身份验证后访问。我已经使用Spring Security 3.0为我的应用程序开发了安全性。现在我想集成令牌基础身份验证。但是我被困在这里了。

我的应用程序ContextSecurity。xml:

<global-method-security pre-post-annotations="enabled">
    </global-method-security>
    <beans:bean id="myAccessDecisionManager"
        class="com.app.security.MyAccessDecisionManager">
    </beans:bean>
    <http auto-config="true" once-per-request="true"
        access-decision-manager-ref="myAccessDecisionManager"       
        access-denied-page="/jsp/errorPage.jsp">
        <intercept-url pattern="/*.app" access="ROLE_ANONYMOUS" />
        <form-login login-page="/login.app"
            login-processing-url="/j_spring_security_check" default-target-url="/login/checking.app"
            authentication-failure-url="/login.app?login_error=1" />
        <logout logout-url="/j_spring_security_logout"
            logout-success-url="/login.app" invalidate-session="true" />
        <session-management invalid-session-url="/login.app"
            session-fixation-protection="newSession">
            <concurrency-control max-sessions="100"
                error-if-maximum-exceeded="false" />
        </session-management>
    </http>

    <authentication-manager alias="authenticationManager">
        <authentication-provider ref="customAuthenticationProvider"></authentication-provider>
    </authentication-manager>

    <beans:bean id="customAuthenticationProvider"
        class="com.app.security.CustomAuthenticationProvider">
    </beans:bean>

我的CustomAuthenticationProvider:

public class CustomAuthenticationProvider implements AuthenticationProvider {

@Autowired
private ILoginService loginService;

protected final transient Log log = LogFactory.getLog(getClass());

public Authentication authenticate(Authentication authentication)
        throws AuthenticationException {

    UsernamePasswordAuthenticationToken usernamePassswordAuthenticationToken = new UsernamePasswordAuthenticationToken(
            authentication.getPrincipal(), authentication.getCredentials());

    // Doing authentication process here and returning authentication token
    return usernamePassswordAuthenticationToken;
}

public boolean supports(Class<? extends Object> authentication) {
    return authentication.equals(UsernamePasswordAuthenticationToken.class);
}
}

我的要求是,

  • 当用户第一次想要访问rest web服务时,他应该从头部向服务器提供用户名/密码
  • 服务器将接受请求,检查身份验证,并为特定时期的未来请求生成令牌。我还需要客户端代码,以了解如何访问安全的web服务。谢谢

共有1个答案

羊舌胡非
2023-03-14

当用户第一次想要访问rest web服务时,他应该从头部向服务器提供用户名/密码。

服务器将接受请求,检查身份验证,并为特定时期的未来请求生成令牌

您可以使用HTTP头或映射到Spring MVC控制器的普通HTTP POST请求(我们在应用程序中就是这样做的):

@Controller
public class AuthenticationController {
    @Autowired
    @Qualifier("authenticationManager")
    AuthenticationManager     authenticationManager;

    @Autowired
    SecurityContextRepository securityContextRepository;

    @RequestMapping(method = RequestMethod.POST, value = "/authenticate")
    public @ResponseBody String authenticate(@RequestParam final String username, @RequestParam final String password, final HttpServletRequest request, final HttpServletResponse response) {
        final UsernamePasswordAuthenticationToken authenticationRequest = new UsernamePasswordAuthenticationToken(username, password);
        final Authentication authenticationResult = this.authenticationManager.authenticate(authenticationRequest);

        final String token = <some randomly generated secure token>;

        final Authentication authentication = new MyAuthenticationToken(authenticationResult, token);

        SecurityContextHolder.getContext().setAuthentication(authentication);

        this.securityContextRepository.saveContext(SecurityContextHolder.getContext(), request, response);

        return token;
    }
}

完成此操作后,客户端应在每个后续请求中以HTTP头发送令牌。

我还需要客户端代码,以了解如何访问安全的web服务

不知道你到底在找什么。如果您的客户端是在web浏览器中运行的JavaScript库,那么在每个请求中将身份验证令牌设置为HTTP头应该很简单。如果您的客户端是一个设备,那么该设备可以将令牌存储在内存中,并使用您用来调用服务的任何HTTP客户端库将其作为HTTP头包含在每个请求中。

 类似资料:
  • 在研究了各种webhook实现之后,我注意到它们使用的安全机制有一种趋势。 Visual Studio Team Services Webhook使用基本身份验证。 微软图形网络钩子在每个网络钩子调用的正文中发送一个明文“clientState”。接收器根据已知值验证clientState。这与基本身份验证类似,因为每个请求都通过线路发送明文凭据。 Slack outgoing Webhook使用

  • 那么,如何将这样的机制集成到项目(Spring Boot app)中呢?提前谢了。

  • 问题内容: 我有一个使用Spring Batch和Spring MVC的应用程序。我可以将Spring Batch Admin单独部署,并与我的应用程序使用的数据库一起使用,尽管我想将其集成到我自己的应用程序中,还可能会修改其中一些视图。 有没有简单的方法可以做到这一点,还是我必须将其分叉然后从那里去? 问题答案: 根据这个线程显然有一个简单的方法; 在以下位置为Batch Admin定义Disp

  • 我熟悉Web存储API和cookies,但是我不知道存储身份验证令牌最安全的方式是什么。我想知道这是否会破坏任何第三方库。 我想要一份详尽的可用方法列表,列出每种方法的优缺点,最重要的是最好的方法(如果有的话)。

  • 我正在构建一个基于令牌的身份验证(Node.js使用带有angular客户端的passport/JWT)。 用户输入凭证后,他将获得一个访问令牌,并在头中的每个请求中发送该令牌(头:bearer token)。 我不想每次他的访问令牌过期时都提示登录请求(我猜大约每天),我听说过刷新令牌。刷新令牌永不过期(或很少过期),并且能够无限期续订令牌。当访问令牌即将过期时,客户端可以通过发送刷新令牌来发送

  • 到目前为止还好。我使用swagger-codegen构建了相应的服务器存根,它遵循connexion安全模型,并提供了两个字段,即承载令牌和“required_scopes”,即应该包含“labuser”。访问endpoint时,调用控制器函数: 当承载令牌正确传递时,是。因此,无法实际验证提供的令牌中显示的凭据和权限是否与授权控制器中endpoint所需的范围相匹配。我考虑在调用的endpoin