如何使用Spring安全性与自定义java类/自定义弹簧框架的类?

时间:2014-02-19 13:22:51

标签: java spring security spring-security

我的要求如下:

在我们的应用程序中,用户的凭据首次针对数据库(不使用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()方法没有被调用。我感到惊讶和困惑。是否有任何机构对我做错的地方有任何想法?

3 个答案:

答案 0 :(得分:2)

听起来您需要实施身份验证提供程序。这是一个非常简单的例子,我认为你可以适应调用你的存储过程。

http://danielkaes.wordpress.com/2013/02/20/custom-authentication-provider-in-spring/

答案 1 :(得分:0)

您可以实现自己的UserDetailsS​​ervice并配置spring以使用它。

<security:authentication-manager>
    <security:authentication-provider user-service-ref="userDetailsServiceImpl"/>
</security:authentication-manager>

答案 2 :(得分:0)

您需要创建一个自定义UserDetailsS​​ervice实现,该实现将检查数据库。

以下是一个示例UserDetailsS​​ervice实现:

@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