Java 我的SpringWebMVC应用程序中的双向登录

Java 我的SpringWebMVC应用程序中的双向登录,java,spring-mvc,authentication,spring-security,basic-authentication,Java,Spring Mvc,Authentication,Spring Security,Basic Authentication,基于SpringWebMVC构建的应用程序。Spring安全版本是3.1.0。应用程序已具有基于登录表单的身份验证系统 现在,我想为整个应用程序介绍另一个身份验证系统(以及现有的身份验证系统)。对新认证系统的要求如下: 用户将到达特定的控制器终点 浏览器将向服务器生成一个请求,请求头将包含一个加密令牌作为凭据 服务器将读取令牌并解密令牌 服务器将验证从解密令牌获取的用户信息 成功验证后,服务器将重定向到主应用程序url(例如example.com) 为了达到这些要求:我已实施如下: Spring

基于SpringWebMVC构建的应用程序。Spring安全版本是3.1.0。应用程序已具有基于登录表单的身份验证系统

现在,我想为整个应用程序介绍另一个身份验证系统(以及现有的身份验证系统)。对新认证系统的要求如下:

  • 用户将到达特定的控制器终点
  • 浏览器将向服务器生成一个请求,请求头将包含一个加密令牌作为凭据
  • 服务器将读取令牌并解密令牌
  • 服务器将验证从解密令牌获取的用户信息
  • 成功验证后,服务器将重定向到主应用程序url(例如example.com)
  • 为了达到这些要求:我已实施如下:

    Spring-security.xml

    <bean id="authEntryPoint" class="com.example.authProvider.AuthEntryPoint"/>
    <bean id="authFilter" class="com.example.authProvider.AuthFilter"/>
    <bean id="authProvider" class="com.example.authProvider.AuthProvider" />
    
    <http pattern="/**/basic-login.html" create-session="stateless" use-  expressions="true" auto-config="true"
              authentication-manager-ref="authManager">
        <intercept-url pattern="/secure/**" access="isFullyAuthenticated()"/>
        <http-basic entry-point-ref="authEntryPoint"/>
        <custom-filter ref="authFilter" before="FORM_LOGIN_FILTER" />
    </http>
    
    <authentication-manager id="authManager">
        <authentication-provider ref="authProvider" />
    </authentication-manager>
    
    AuthFilter.java

    public class AuthFilter extends OncePerRequestFilter{
    
    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    
        String xAuth = request.getHeader("Authorization");
        String info = request.getHeader("encryptedInfo");
        //decrypt the info and verify the info. if info not valid throw 401 status. 
    
        if (info != valid) {
            response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Token-invalid");
        } else {
            filterChain.doFilter(request, response);
        }
    }
    }
    
    AuthProvider.java

    public class AuthProvider implements AuthenticationProvider {
    
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        String username = authentication.getName();
        String password = (String) authentication.getCredentials();
        User user= loadUserFromDB(username);
    
        return new UsernamePasswordAuthenticationToken(user, password, authorities);
    }
    
    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }
    
    private User loadUserFromDB(String username)
            throws UsernameNotFoundException, DataAccessException {
        //implement to load user from db
        return new User(username, password, true,
                true, true, true,
                Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER")));
    }
    }
    
    公共类AuthProvider实现AuthenticationProvider{
    @凌驾
    公共身份验证(身份验证)引发AuthenticationException{
    字符串username=authentication.getName();
    字符串密码=(字符串)身份验证。getCredentials();
    用户=loadUserFromDB(用户名);
    返回新的用户名PasswordAuthenticationToken(用户、密码、权限);
    }
    @凌驾
    公共布尔支持(类身份验证){
    返回authentication.equals(UsernamePasswordAuthenticationToken.class);
    }
    私有用户loadUserFromDB(字符串用户名)
    抛出UsernameNotFoundException、DataAccessException{
    //实现从数据库加载用户
    返回新用户(用户名、密码、true、,
    真的,真的,真的,,
    Collections.singletonList(新的SimpleGrantedAuthority(“角色用户”));
    }
    }
    
    如何实现onAuthenticationSuccess处理程序?因为它是基本的身份验证过程


    为了澄清,请查看
    标记中有一个名为authentication success handler ref的属性,我可以在其中添加一个authentication success handler。但是在
    标记中,没有这样的属性,对吗?那么如何设置AuthenticationSuccess处理程序呢?

    我已将您的文本添加到问题中。我现在将投重新开放的一票,因为我没有春季技能;据我估计,这个问题更清楚。如果
    的拼写不正确,我可以请您编辑这个问题吗?应该是
    ?@halfer-当然。谢谢
    public class AuthProvider implements AuthenticationProvider {
    
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        String username = authentication.getName();
        String password = (String) authentication.getCredentials();
        User user= loadUserFromDB(username);
    
        return new UsernamePasswordAuthenticationToken(user, password, authorities);
    }
    
    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }
    
    private User loadUserFromDB(String username)
            throws UsernameNotFoundException, DataAccessException {
        //implement to load user from db
        return new User(username, password, true,
                true, true, true,
                Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER")));
    }
    }