我的要求如下:
在我们的应用程序中,用户的凭据首次针对数据库(不使用Spring安全性,因为它是遗留应用程序)进行验证。如果用户是有效用户,他将登录到该应用程序。一旦用户登录到应用程序,他就可以进行少量休息呼叫。现在,我想在进行任何休息呼叫之前再次使用spring security来验证用户的凭据。在这里,挑战是我们不应该重新设计数据库模式。我们需要使用验证用户的存储过程。如果身份验证失败,此特定存储过程将返回错误消息,否则不返回任何内容。在这种情况下没有定义角色。只需使用存储过程进行简单身份验证现在,我希望通过春季安全来完成这一切。可能正在编写一个java类/自定义spring框架的类,并在其中调用存储过程并在spring安全配置文件中使用该类。任何人都可以建议如何启动吗?
我已经实现了AuthenticationProvider。以下是* security.xml。
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/rest/*" access="permitAll"></intercept-url>
</http>
<authentication-manager >
<authentication-provider ref="csAuthenticationProvider" />
</authentication-manager>
但是,安全框架正在寻找角色。在我的情况下,没有定义角色。正如我之前所说,用户首次进行身份验证,而不使用spring框架。如果用户想要进行任何休息呼叫,则spring安全性需要重新认证用户。这并不意味着用户需要重新输入凭据。用户的凭据在休息呼叫/请求中可用,因为他已经过身份验证。唯一需要做的是我需要使用请求使用凭据并使用存储过程重新验证。当然,使用AuthenticationProvider可能是一个好主意,但身份验证(身份验证身份验证)方法的参数“身份验证身份验证”对我没用,因为我需要再次调用我自己的存储过程调用。暂时,我没有使用Authentication对象,而是使用authenticate()方法中的存储过程调用代码。但是,奇怪的是,authenticate()方法没有被调用。我感到惊讶和困惑。是否有任何机构对我做错的地方有任何想法?
答案 0 :(得分:2)
听起来您需要实施身份验证提供程序。这是一个非常简单的例子,我认为你可以适应调用你的存储过程。
http://danielkaes.wordpress.com/2013/02/20/custom-authentication-provider-in-spring/
答案 1 :(得分:0)
您可以实现自己的UserDetailsService并配置spring以使用它。
<security:authentication-manager>
<security:authentication-provider user-service-ref="userDetailsServiceImpl"/>
</security:authentication-manager>
答案 2 :(得分:0)
您需要创建一个自定义UserDetailsService实现,该实现将检查数据库。
以下是一个示例UserDetailsService实现:
@Service("userService")
public class UserDetailsServiceImpl implements UserDetailsService, InitializingBean {
@Autowired
private AccountService accountService;
public void afterPropertiesSet() throws Exception {
}
@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
username = username.toLowerCase();
try {
Account account = accountService.loadUserAccountByEmail(username);
if (account == null) {
throw new UsernameNotFoundException("Could not find email: " + username + "in the DB.");
}
List<GrantedAuthority> auths = new ArrayList<GrantedAuthority>();
for (Role r : account.getRoles()) {
auths.add(new SimpleGrantedAuthority(r.getRole()));
}
ApplicationUser user = null;
try {
user = new ApplicationUser(new Long(account.getId()), username, account.getPassword(), true, true, true, true, auths);
} catch (Exception ex) {
ex.printStackTrace();
}
return user;
} catch (Exception e) {
e.printStackTrace();
throw new UsernameNotFoundException(username + "not found", e);
}
}
}
我在代码中配置如下:
@Override
protected void registerAuthentication(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(userDetailsServiceImpl)
.passwordEncoder(bCryptPasswordEncoder());
}
(您还可以看到我撰写的关于从xml切换到@annotation配置的博客文章,以便在此处引用该项目:http://automateddeveloper.blogspot.co.uk/2014/02/spring-4-xml-to-annotation-configuration.html)