Java 在筛选器中从数据库对用户进行身份验证是一种好做法吗?

Java 在筛选器中从数据库对用户进行身份验证是一种好做法吗?,java,spring,rest,spring-boot,Java,Spring,Rest,Spring Boot,我正在为Android应用程序创建一个RESTAPI(SpringBoot项目)。从数据库对用户进行身份验证的理想方法是什么? 1。查询控制器类中的数据库 2.在筛选器类中查询数据库 3.使用Spring Security public class TokenValidationFilter implements Filter { Connection connection = null; @Override public void

我正在为Android应用程序创建一个RESTAPI(SpringBoot项目)。从数据库对用户进行身份验证的理想方法是什么?

1。查询控制器类中的数据库
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 {}
 }

您不需要添加自己的
过滤器

当您使用Spring security时,它只通过添加过滤器来工作,例如,
BasicAuthenticationFilter
。除此之外,它还允许你管理一些你需要自己做的事情

例如,它允许您通过
SecurityContextHolder.getContext().getAuthentication()
简单地使用经过身份验证的主体,因为它基于ThreadLocal工作,所以您可以在代码中的任何位置使用它

如何管理不同URL的授权?还是管理CORS配置

在使用
框架配置
Spring-security
时,所有这些都可以通过一个简单的构建器模式来实现

另外,如果您以后想使用OAuth,安全框架与之集成,您可以使用
AuthorizationServer
ResourceServer

即使对于最简单的基本身份验证配置,您也应该使用安全框架,而不是使用发言式解决方案进行身份验证

您还可以认为还有其他东西与安全框架集成在一起,比如审核由哪个用户修改的数据库事务,等等


您将要在自己的
过滤器中编写的内容(以及将来要重构的内容)已经在框架中编写好供您使用

  • 在控制器类中查询数据库
  • 不,这样做会使您的业务控制器与身份验证机制紧密结合,而这不是此类组件的目的

  • 在Filter类中查询数据库
  • 我假设您讨论的是Servlet过滤器类。这样,您可能会重新发明轮子,并最终得到大量自制的样板代码。当您谈到SpringSecurityPoint3时,我假设您有一个Spring后端

  • 使用Spring安全性
  • 如果您有一个Spring后端,那么这就是您要走的路。SpringSecurity提供了一些标准的身份验证机制(例如基本身份验证)。如果有这样的需求,您可以添加一些Spring安全扩展,如OAuth2或SAML。它是一个广泛使用的框架,因此寻求帮助应该不是问题。 此外,SpringSecurity允许您创建自己的安全配置,以防没有一个标准适合您

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

    • 您肯定应该避免控制器类中验证用户

    • Spring Security是在Spring启动应用程序中验证用户的最推荐方法

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

    我认为连接控制器或过滤器上的数据库不是一个好的软件设计实践。这不是市场惯例。最常用的方法是创建一个数据访问对象(DAO),该对象将负责正确执行查询。您可以在此处查看此设计模式的更多详细信息:

    连接数据(如用户ID、密码、令牌等)通常存储在应用程序配置文件(web.xml、AndroidManifest.xml或persistence.xml)中,必须在运行时检索。并且可以通过父类(例如GenericDAO)建立连接,并作为继承属性进行检索。请看这里:


    以这种方式组织代码将有助于根据每一层的性质划分系统的责任。

    我同意这一点。尽管我必须说,Spring安全性可能变得如此复杂,以至于OP的过滤思想在某种程度上是显而易见的。对于OP的用例,Spring安全性的配置是最小的,即使如此,我也不会说它会变得复杂,它非常清楚地提供了关注点的分离。