【问题标题】:Apache Shiro SQL error while authenticating user验证用户时 Apache Shiro SQL 错误
【发布时间】:2017-04-14 22:50:37
【问题描述】:

我正在尝试连接到数据库以使用 Apache Shiro 对用户进行身份验证。我有一个 servlet 调用一个 java 类来执行这个任务。现在,如果成功验证,它只是更改一个字符串。我尝试了许多不同的连接方法:数据池、jtds、Microsoft Sql Server JDBC,都给我错误:

验证用户 [user1] 时出现 SQL 错误

我的日志文件也显示此错误:

警告:RAR5058:调整池 SQLS1-TestBilling 的大小时出错。异常:无法分配连接,因为:与主机 SQLS1、端口 1433 的 TCP/IP 连接失败。错误:“null。验证连接属性。确保 SQL Server 实例正在主机上运行并在端口接受 TCP/IP 连接。确保与端口的 TCP 连接未被防火墙阻止。”。

我可以在 servlet 中使用 TestBilling 连接池,所以我认为这不是池的问题,但似乎无法使用 ini 文件声明来使用 SQL。有什么我遗漏、忘记做或做错了吗?

以下是相关文件:

GetAuthServlet.java:

package com.phmc.shiro5web;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class GetAuthServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Auth</title>");            
        out.println("</head>");
        out.println("<body>");
        AuthenticationClass au = new AuthenticationClass();

        String b = ""; 
        b = au.isAuthenticated("mmarino", "test");
        out.println(b);
        out.println("</body>");
        out.println("</html>");
}

AuthenticationClass.java:

package com.phmc.shiro5web;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class AuthenticationClass {
    private static final transient Logger log = LoggerFactory.getLogger(Authentication.class);



    String isAuthenticated(String username, String password){
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);
        Subject currentUser = SecurityUtils.getSubject();
        String  b = "fail";
        log.info("Test");
        try{
            if (!currentUser.isAuthenticated()) {

                UsernamePasswordToken token = new UsernamePasswordToken("mmarino", "test")   ;
                token.setRememberMe(true);
                try {
                    currentUser.login(token); 
                    b = "Success";
                }catch (UnknownAccountException uae) {
                    log.info("There is no user with username of " + token.getPrincipal());
                } 
            }
        }catch(Exception e){
            b = e.toString();
        }
        )
        return b;
    }

}

Shiro.ini:

[main]
ds = org.apache.shiro.jndi.JndiObjectFactory
ds.resourceName = jdbc/TestBilling


jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.dataSource = $ds
jdbcRealm.permissionsLookupEnabled = true
jdbcRealm.authenticationQuery = SELECT theuser FROM UserList
securityManager.realm = $jdbcRealm

我也试过: jdbcRealm.authenticationQuery = SELECT theuser FROM UserList where passwordList = ?

在 Shiro.ini 文件中倒数第二行。

【问题讨论】:

  • 你的连接池有多大?
  • @BrianDemers “多大”是什么意思?目前我们仍处于测试模式,所以流量并不大,我只能告诉你。
  • 是的,但是如果池非常小,并且您有多个连接(一个来自 Shiro,另一个来自您的 servlet),则不需要太多。您还将在每个请求上创建一个新的 SecurityManager。我建议看看 Shiro web sample,或者看看 we app doc。我建议作为起点,一旦您设置了 Shiro servlet 过滤器并开始工作,添加自定义逻辑会容易得多。

标签: java sql-server web-services security shiro


【解决方案1】:

试试

# DataSource config 
ds = org.apache.shiro.jndi.JndiObjectFactory 
ds.requiredType = javax.sql.DataSource
ds.resourceName = jdbc/TestBilling

【讨论】:

  • 我寄予厚望,但这次更改仍然出现同样的错误。 :-(
【解决方案2】:

似乎还有一个我没有发现的额外错误导致 log4j 中断,这使得其他显示基本 SQL 错误的错误无法被看到。

【讨论】:

    猜你喜欢
    • 2018-11-30
    • 2017-09-04
    • 2017-06-28
    • 2014-12-20
    • 2016-04-02
    • 2013-07-20
    • 1970-01-01
    • 2016-10-29
    • 2017-02-01
    相关资源
    最近更新 更多