2

我已经在我的 struts2 应用程序上实现了 Spring 安全性,它运行良好,但它在第 3 行遇到错误 java.lang.NullPointerException。

尽管似乎 passwordEncoder 配置可以通过添加那些我无法再使用纯文本密码登录的内容来工作。

 <authentication-manager> 
        <authentication-provider>
           <password-encoder ref="passwordEncoder"/>

            <jdbc-user-service data-source-ref="dataSource"

                           users-by-username-query="
              select username,password,enabled 
              from Users where username=?" 

                           authorities-by-username-query="
                      select username,authority 
                      from Users where username = ?"

        />
        </authentication-provider> 

    </authentication-manager> 
    <beans:bean id="passwordEncoder" 
        xmlns="http://www.springframework.org/schema/beans"            
        class="org.springframework.security.authentication.encoding.ShaPasswordEncoder">
        <constructor-arg value="256"/>
    </beans:bean>
</beans:beans>

MyClass.java

    import org.springframework.security.authentication.encoding.ShaPasswordEncoder;;
    ....
    private ShaPasswordEncoder passwordEncoder;

     public ShaPasswordEncoder getPasswordEncoder() {
         return passwordEncoder;
     }
     @Autowired
     public void setPasswordEncoder(ShaPasswordEncoder passwordEncoder) {
           this.passwordEncoder = passwordEncoder;
      }

     public void encode(String username)
        {
1             System.err.println("encode password");
2             String encodedPassword = "";
3             encodedPassword = passwordEncoder.encodePassword("Jack",username);
4             System.err.println("encoded password " + encodedPassword);
        }

pom.xml

   <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>3.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>3.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>3.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-taglibs</artifactId>
            <version>3.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>3.1.1.RELEASE</version>
        </dependency>
4

2 回答 2

3

@Autowired仅适用于 Spring 托管 bean。所以你MyClass应该是 a @Serviceor @Repositoryor @Componentetc (或者它可以简单地在你的 XML 中配置为 a <bean>

另外,我不明白你的

我不能再用纯文本密码登录了。

用户输入密码的编码以及与数据库中编码密码的比较是由 Spring Security 内部完成的。它所需要的只是一个UserDetails由您提供的对象jdbc-user-service

于 2013-07-14T09:57:12.213 回答
3

你真的以某种方式将编码器注入到 Encode.java 中吗?如果没有,那是你的问题。

如果您需要一个可能会起作用的快速而肮脏的解决方案。做吧

 private ShaPasswordEncoder passwordEncoder=new ShaPasswordEncoder(256);

然后找出你在注射时做错了什么。

也许阅读this以了解应该如何进行注射。

Spring Framework 中的@Inject 和@Autowired 有什么区别?在什么条件下使用哪一种?

于 2013-07-05T00:06:35.403 回答