2013-10-08 73 views
0

我有一個名爲security.properties文件,該文件是這樣的:文件作爲字符串數組春

com.example.test.admins=username,username1,username2 

我想該文件作爲一個字符串數組來讀取。實際工作中的一個包:

package com.example.test.security 

import org.springframework.beans.factory.annotation.Value 
import org.springframework.ldap.core.DirContextOperations 
import org.springframework.security.core.GrantedAuthority 
import org.springframework.security.core.authority.SimpleGrantedAuthority 
import org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator 

class CustomLdapAuthoritiesPopulator implements LdapAuthoritiesPopulator { 
    @Value('${com.example.test.admins}') 
    private String[] admins 

    @Override 
    public Collection<? extends GrantedAuthority> getGrantedAuthorities(
      DirContextOperations userData, String username) { 
     def roles = [new SimpleGrantedAuthority("user")] 
     if (username in admins) 
      roles.add(new SimpleGrantedAuthority("admin")) 
     roles 
    } 
} 

我檢查每個輸入,每次使用比導入文件以外的東西。

在不同的包裝,它忽略了串內插:

package com.example.test.controller 

// imports excluded for brevity 

@Controller 
class UserController { 
    @Value('${com.example.test.admins}') 
    private String[] admins 

    public User get() { 
     def name = // Name gets put here 
     def admin = name in admins 
     println admins 
     println admin 
     return new User(name: name, admin: admin) 
    } 
} 

即產生該輸出在控制檯:

[${com.example.test.admins}] 
false 

的文件的唯一一提的是在security-applicationContext.xml

<context:property-placeholder 
    location="classpath:security.properties" 
    ignore-resource-not-found="true" 
    ignore-unresolvable="true"/> 

但是,將其複製到applicationContext.xml不會更改任何東西。

+0

控制器可能使用servlet應用程序上下文,而不是根上下文。看到這個:http://stackoverflow.com/questions/11890544/spring-value-annotation-in-controller-class-not-evaluating-to-value-inside-pro – ataylor

+0

你是完全正確的。感謝您的鏈接。我會發佈一個答案。 – lcarsos

回答

1

感謝@ ataylor指引我在正確的方向。

Spring中的控制器不使用相同的上下文。所以,我創建了一個服務,稱爲UserService

@Service 
class UserService { 
    @Value('${com.example.test.admins}') 
    private String[] admins 

    boolean getUserIsAdmin(String username) { 
     username in admins 
    } 

} 

而在UserController中的服務自動連接,它就像一個魅力。