1

スプリングセキュリティデータベース駆動型と暗号化されたパスワードを使用したアプリケーションを1つ作成しました。しかし、それは機能していません。ユーザーの資格情報を暗号化されたパスワードとしてxmlファイルに構成すると、正常に機能します。誰かが解決策を知っているなら助けてください。

org.springframework.security.authentication.encoding.ShaPasswordEncoder.encodePassword( "password"、null);を使用してパスワードをエンコードしました。誰かが解決策を知っているなら、リプレイしてください。ありがとうございました。

これが私のapplicationContext.xmlです

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:security="http://www.springframework.org/schema/security"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
       http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">

<!-- ADD PERSISTENCE SUPPORT HERE (jpa, hibernate, etc) -->
<bean class="org.apache.commons.dbcp.BasicDataSource" id="dataSource" destroy-method="close" >
        <property name="driverClassName">
            <value>com.microsoft.sqlserver.jdbc.SQLServerDriver</value>
        </property>
        <property name="url">
            <value>jdbc:sqlserver://192.162.101.111;databaseName=test</value>
        </property>
        <property name="username">
            <value>root</value>
        </property>
        <property name="password">
            <value>testroot</value>
        </property>
        <property name="maxActive" value="100"/>
        <property name="maxWait" value="10000"/>
    <property name="maxIdle" value="10"/>
    </bean>


<!--- Spring security configuration --->
<security:http auto-config="true"  >
<!-- Restrict URLs based on role -->
<security:intercept-url pattern="/POC/" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<security:intercept-url pattern="/common/reportgenerator/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />

<security:intercept-url pattern="/common/**" access="ROLE_BIDDER,ROLE_OFFICER" />

<security:intercept-url pattern="/bidder/**" access="ROLE_BIDDER" />
<security:intercept-url pattern="/officer/**" access="ROLE_OFFICER" />


<!--  Override default login and logout pages -->
<security:form-login login-page="/Login"
login-processing-url="/j_spring_security_check"
default-target-url="/"
always-use-default-target="true"
authentication-failure-url="/loginfailed" />
<security:logout logout-success-url="/logout" />
</security:http>


<security:authentication-manager>
       <security:authentication-provider user-service-ref=""  >
       <security:user-service >
        <security:user   name="krupa@egp.com"                           password="c06d3569e5cb23eea69c8e264cbb43d817b95c2d"                     authorities="ROLE_OFFICER" />
    </security:user-service>
    <security:jdbc-user-service data-source-ref="dataSource"
    users-by-username-query="select  emailid username,lower(password)   password,'true' enabled from tbl_LoginDetails where emailid=?"
    authorities-by-username-query="select a.emailid username,b.authority from   tbl_LoginDetails a,tbl_UserRoles b where a.userId=b.userId and a.emailid=?"     />
       <security:password-encoder ref="passwordEncoder" base64="false"/>
    </security:authentication-provider>
</security:authentication-manager>

<bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"></bean>
</beans>

WEB.xmlには次のものが含まれます。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/</url-pattern>
    </filter-mapping>

    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>

    <listener>
            <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
        </listener>
<listener>
        <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

<listener>
    <listener-class>
        org.springframework.web.util.Log4jConfigListener
   </listener-class>
</listener>


 <!-- Spring Security filter entry -->
 <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
    </filter-mapping>
</web-app>

コントローラーの詳細:

package com.abc.controller;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;

@Controller
@RequestMapping("/")
public class HomeController  
{
    private static Logger logger = Logger.getLogger("controller");
    @RequestMapping
    public String showHome(ModelMap model) {
        logger.debug("this is a sample log message.");

    if(SecurityContextHolder.getContext().getAuthentication().isAuthenticated() && !SecurityContextHolder.getContext().getAuthentication().getPrincipal().toString().equalsIgnoreCase("anonymousUser"))
    {
    User user = null;
    user=(User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();

    System.out.println(SecurityContextHolder.getContext().getAuthentication().getCredentials());

    if(user !=null )
    {
    String name = user.getUsername();
    model.addAttribute("username", name);
    }

 }
return "home";
}

    @RequestMapping(value="/loginfailed", method = RequestMethod.GET)
    public String loginerror(ModelMap model) {
        logger.debug("login failed");
        model.addAttribute("error", "true");
        return "login";

    }

    @RequestMapping(value="/logout")
    public String logout(ModelMap model) {
        logger.debug("log out");
        return "login";
    }

    @RequestMapping(value="/bidder/dashboard")
    public String bidderDashboard(ModelMap model) {
        return "bidder/dashboard";
    }

    @RequestMapping(value="/officer/dashboard")
    public String officerDashboard(ModelMap model) {
        return "officer/dashboard";
    }

}  

ログインJSPページは次のとおりです。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<html>
<head>
<title>Login Page</title>
<style>
.errorblock {
    color: #ff0000;
    background-color: #ffEEEE;
    border: 3px solid #ff0000;
    padding: 8px;
    margin: 16px;
}
</style>
</head>
<body onload='document.f.j_username.focus();'>
    <h3>Login </h3>

    <c:if test="${not empty error}">
        <div class="errorblock">
            Your login attempt was not successful, try again.<br />                 Caused :<spring:message code="SPRING_SECURITY_LAST_EXCEPTION"           text="Default Text" />
        </div>
    </c:if>

    <form name='f' action="<c:url value='j_spring_security_check' />"
        method='POST'>
        <table>
            <tr>
                <td>User:</td>
                <td><input type='text' name='j_username' value=''>
                </td>
            </tr>
            <tr>
                <td>Password:</td>
                <td><input type='password' name='j_password' />
                </td>
            </tr>
            <tr>
                <td colspan='2'><input name="submit" type="submit"
                    value="submit" />
                </td>
            </tr>
            <tr>
                <td colspan='2'><input name="reset" type="reset" />
                </td>
            </tr>
        </table>
    </form>
</body>
</html>

4

2 に答える 2

1

それは本当にあなたが実行している構成ファイルですか? それにはいくつかの問題があるように見えます

投稿した構文<authentication-manager>が正しくありません。認証する複数のユーザー データ ソースを構成するには、複数のauthentication-provider要素が必要です。あなたは1つしか持っておらず、要素jdbc-user-serviceを優先しておそらく無視されます。user-service

password-encoder要素に関連付けられていないuser-serviceため、エンコードされたパスワードでは機能しませんが、機能すると言います。本気ですか?

パスワードの SQL クエリから取得した値が、パスワード エンコーダーによって計算された正しいパスワードと正確に一致することを確認します (手動で確認してください)。

これらのいずれも役に立たない場合は、実際に何が問題なのかをより明確に説明してください。動作しないものと、使用しているバージョン番号は? 何よりも、ログイン中のデバッグ ログの出力は何ですか? それは、何が起こっているのかについてのいくつかの指針を提供する可能性が最も高い.

また、web.xmlコントローラ、およびログイン ページは、パスワード エンコーディングの問題に関連する可能性は低いため (ある構成では正常にログインでき、別の構成では正常にログインできない場合)、おそらくそれらを削除できます。

于 2012-05-15T16:48:49.700 に答える
0

足りないものは2つあると思います!

1. on に 2 つの異なる要素を含めることはできません。したがって、それらのいずれかを削除するか、別の認証プロバイダーを追加してください。

2. ユーザーが提供したパスワードが暗号化されている場所がわかりません。ご存じのように、両方のパスワード (データベース内のパスワードとユーザーが指定したパスワード) は暗号化され、同じでなければなりません。

于 2012-06-16T13:10:24.737 に答える