我尝试使用spring security

时间:2016-07-11 06:43:41

标签: java spring spring-security

我是Spring安全的新手。我需要创建3种类型的自动化。

by ip 
by sms 
by pin code

现在我尝试通过ip实现auth。我使用弹簧安全。

我获取客户端的ip地址(我的spring-boot应用程序)并通过rest传递给后端服务器(另一个远程java服务器)。如果用户通过身份验证,我会在我的春季应用程序中获得此用户,并且我会向他显示index.html或者如果没有 - 我得到null并且我想要显示他login.html

我创建AuthenticationProvider

@Component
public class IPAddressBasedAuthenticationProvider implements AuthenticationProvider {
    @Autowired
    private HttpServletRequest request;
    @Autowired
    AuthService authService;

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        String ipAddress = request.getRemoteAddr();
        AuthLkUser authLkUserByIp = authService.getAuthLkUserByIp(ipAddress);

        if (authLkUserByIp == null) return null;

        boolean b = authService.checkAuthLkUser(authLkUserByIp);
        if (b) return null;
        UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken("John Principal", "PlaceholderPWE");
        result.setDetails(authentication.getDetails());
        result.setAuthenticated(true);
        return result;
    }

    @Override
    public boolean supports(Class<?> aClass) {
        return true;
    }
}

当我在debbug模式下打开例如index.html和我的春季应用程序的页面时,我检查了debbug点(方法已经知道)并且我有authLkUserByIp(用户通过身份验证)。我有result并返回它。但在页面上我有错误

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Mon Jul 11 12:48:25 ALMT 2016
There was an unexpected error (type=Forbidden, status=403).
Access is denied

但是用户通过了身份验证。为什么我有错误?

我试过this example

但我没有web.xml。代码中的所有配置。

我有一些想法: 1.为什么我会收到错误以及如何解决? 2.当我意识到另外两种类型的身份验证时如何管理它?

1 个答案:

答案 0 :(得分:0)

我认为你错过了grantedAuths,因为Spring安全与角色合作。

这是我如何使用CustomAuthenticationProvider

处理授权的示例
@Override
    public Authentication authenticate(Authentication auth) throws AuthenticationException {
        String username = String.valueOf(auth.getName());
        String password = String.valueOf(auth.getCredentials().toString());

        Usuarios us = null;
        boolean success = false;
        try {
            us = user.findByName(username);
            success = passwordEncoder.matches(password, us.getClave());
        } catch (Exception ex) {
        }    
        if (success == true) {
            final List<GrantedAuthority> grantedAuths = new ArrayList<>();
            String authority;
            switch (us.getRoles().getNombre()) {
                case "administrador":
                    authority = "ROLE_ADMIN";
                    break;
                case "vendedor":
                    authority = "ROLE_VENDEDOR";
                    break;
                default:
                    authority = "ROLE_NONE";
                    break;
            }
            GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(authority);
            grantedAuths.add(grantedAuthority);
            final UserDetails principal = new User(username, password, grantedAuths);
            final Authentication authentication = new UsernamePasswordAuthenticationToken(principal, password, grantedAuths);
            us = null;
            return authentication;
        } else {
            throw new BadCredentialsException("Bad Credentials");
        }
    }

首先,我检查我的服务的用户权限,在我的数据库中找到它,我想你可以跳过这个,并直接用GrantedAuthority协助你的角色。

然后,您可以构建UserDetails并使用GrantedAuthority设置用户及其角色的信息。

最后建立你的Authentication以返回它。所有的前提步骤。