从过滤器中的数据库验证用户是一个好习惯吗?

时间:2018-04-07 15:39:38

标签: java spring rest spring-boot

我正在为Android App创建一个Rest API(Spring Boot项目)。从数据库中验证用户的理想方法是什么?

1。在Controller类中查询数据库
2.查询过滤器类中的数据库
3.使用Spring Security

    public class TokenValidationFilter implements Filter {

        Connection connection = null; 

        @Override
        public void doFilter(ServletRequest request, 
            ServletResponse response, FilterChain chain)
          throws IOException, ServletException {
            final String accessToken = req.getHeader("accessToken");
            final String userId = req.getHeader("userId");

            // Do Sql Query to Authenticate User
        }

        @Override
        public void init(FilterConfig filterConfig) throws ServletException {}
 }

4 个答案:

答案 0 :(得分:2)

您不应该添加自己的Filter

当您使用Spring安全性时,它只能添加一个过滤器,例如BasicAuthenticationFilter。除此之外,它还允许您管理自己需要做的事情。

例如,它允许您通过SecurityContextHolder.getContext().getAuthentication()的简单方式使用Authenticated主体,因为它基于ThreadLocal,您可以在代码中的任何位置使用它。

如何管理不同网址的授权?或管理CORS配置?

使用Spring security配置framework时,所有这些都可以通过简单的构建器模式实现。

另外,如果您希望稍后使用OAuth,则会将安全框架与其集成,您可以使用AuthorizationServerResourceServer

轻松地将其工作

即使是最简单的基本身份验证配置,您也应该使用安全框架,而不是使用be-spoke解决方案进行身份验证。

此外,您可以认为安全框架中还集成了其他内容,例如审核由哪个用户修改的数据库事务等。


您在自己的Filter中撰写(以及将来重构)的内容已经写在框架中供您使用。

答案 1 :(得分:1)

  • 您绝对应该避免控制器类中对用户进行身份验证。

  • Spring Security 是在Spring Boot应用程序中对用户进行身份验证的最佳方法。

    • 它相对易于使用且基于标准servlet filters。这样您就可以避免编写自己的自定义过滤器。
    • 允许对端点和HTTP方法组合进行细粒度控制。
    • 允许不同类型的身份验证 - Basic AuthenticationOAuth2MTLS等。
    • 允许您忽略某些端点的安全性。
    • 要配置spring security,请创建一个扩展WebSecurityConfigurerAdapter
    • 的自定义安全配置类
    • 通过编写自定义AuthenticationProvider,使用Spring安全性配置数据库相对容易。您在此提供程序中调用数据库。

答案 2 :(得分:0)

  1. 在Controller类中查询数据库
  2. 不,这样做会使您的业务控制器与认证机制紧密结合,这不是此类组件的目的

    1. 在过滤器类中查询数据库
    2. 我假设您谈论Servlet Filter类。通过这种方式,您可能会重新发明轮子并最终获得大量自制的样板代码。当你谈到Spring Security第3点时,我假设你有一个Spring后端。

      1. 使用Spring Security
      2. 定义如果你有一个Spring后端的方法。 Spring安全性提供了一些标准的身份验证机制(例如BASIC身份验证)。如果有这样的要求,您可以添加一些Spring Security扩展,如OAuth2或SAML。它是一个广泛使用的框架,因此寻找帮助应该不是问题。 此外,Spring Security允​​许您创建自己的安全配置,以防所有标准都没有。

        从移动应用程序的角度来看,设置基本身份验证以获取Json Web令牌,然后使用令牌访问API应该非常直接并且可以使用Spring Security进行维护。或者您可以依赖某些标准,如OAuth2 - OpenIdConnect。无论哪种方式都可以使用Spring Security。

答案 3 :(得分:0)

我认为在Controller或Filter上连接数据库并不是一个好的软件设计实践。这不是市场惯例。最常见的是创建一个数据访问对象(DAO),负责正确地进行查询。您可以在此处查看此设计模式的更多详细信息:https://www.tutorialspoint.com/design_pattern/data_access_object_pattern.htm

连接数据(如UserID,Password,Token等)通常存储在应用程序配置文件(web.xml,AndroidManifest.xml或persistence.xml)中,必须在运行时检索。并且可以通过父类(例如GenericDAO)进行连接,并将其作为继承属性进行检索。看看这里:How do I implement a DAO manager using JDBC and connection pools?

以这种方式组织代码将帮助您分离系统的职责,具体取决于每个层的性质。​​