我是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.当我意识到另外两种类型的身份验证时如何管理它?
答案 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
以返回它。所有的前提步骤。