我正在为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 {}
}
答案 0 :(得分:2)
您不应该添加自己的Filter
。
当您使用Spring安全性时,它只能添加一个过滤器,例如BasicAuthenticationFilter
。除此之外,它还允许您管理自己需要做的事情。
例如,它允许您通过SecurityContextHolder.getContext().getAuthentication()
的简单方式使用Authenticated主体,因为它基于ThreadLocal,您可以在代码中的任何位置使用它。
如何管理不同网址的授权?或管理CORS配置?
使用Spring security
配置framework
时,所有这些都可以通过简单的构建器模式实现。
另外,如果您希望稍后使用OAuth,则会将安全框架与其集成,您可以使用AuthorizationServer
和ResourceServer
即使是最简单的基本身份验证配置,您也应该使用安全框架,而不是使用be-spoke解决方案进行身份验证。
此外,您可以认为安全框架中还集成了其他内容,例如审核由哪个用户修改的数据库事务等。
您在自己的Filter
中撰写(以及将来重构)的内容已经写在框架中供您使用。
答案 1 :(得分:1)
您绝对应该避免在控制器类中对用户进行身份验证。
Spring Security 是在Spring Boot应用程序中对用户进行身份验证的最佳方法。
servlet filters
。这样您就可以避免编写自己的自定义过滤器。Basic Authentication
,OAuth2
,MTLS
等。WebSecurityConfigurerAdapter
。AuthenticationProvider
,使用Spring安全性配置数据库相对容易。您在此提供程序中调用数据库。 答案 2 :(得分:0)
不,这样做会使您的业务控制器与认证机制紧密结合,这不是此类组件的目的
我假设您谈论Servlet Filter类。通过这种方式,您可能会重新发明轮子并最终获得大量自制的样板代码。当你谈到Spring Security第3点时,我假设你有一个Spring后端。
定义如果你有一个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?
以这种方式组织代码将帮助您分离系统的职责,具体取决于每个层的性质。