tags:

views:

188

answers:

1

I was trying out spring-security for a sample web application. When declaring the LDAPAuthenticationProvider, I noticed that you have to declare all your settings with in the applicationContext.xml file!

As a spring newbie, I do understand that one would have to declare dependecies in the applicationContext file. However, in a typical enterprise scenario, you would have an admin configure your ldap settings. So, you would need to load ldap server related information from a database into your application and then connect to the configured server. If this were the scenario, how do I handle this in Spring?

+2  A: 

You can have the properties in an external, properties file, in the form:

ldapUsername=value1
ldapPassword=value2

And in the beginning of you applicationContext.xml put the following:

<context:property-placeholder location="classpath:application.properties" />

then you can use them in the following manner:

<bean id="someId" class="...">
   <property name="ldapUsername" value="${ldapUsername}" />
   <property name="ldapPassword" value="${ldapPassword}" /> 
</bean>

Thus your admin will configure the properties in the simple file application.properties without the need to look at the complex applicationContext.xml

If you want them fetched from a different source than a properties file, you can extend spring's PropertyPlaceholderConfigurer and provide the functionality to fetch the properties from a DB.

This answer to a question similar to yours shows an example of how to implement such.

Update in order to have your values injected at runtime, you will have to define your beans to be of scope prototype. Otherwise, once instantiated (wiht the initial settings), your beans will never change. However that is quite a big change for such simple effects. That's why I'd suggest the following:

  1. Create a (password-protected) UI where the administrator can fill his settings (or at least press a button "I changed the settings"

  2. on pressing the button update the settings/reload the settings from the database and set them in your singleton bean.

Since you are using spring-mvc, you can simply inject your bean in a spring controller and update the settings. Like:

public class MyController {
    @Autowired
    private LDAPAuthenticationProvider ldapProvider;

    public void saveSettings(..) {
         // get the new username and password first
         ldapProvider.setUsername(newUsername);
         ldapProvider.setPassword(newPassword);
    }
}

(if you don't want to use annotations, just use <property name="ldapProvider" ref="ldapProvider" /> in your controller definition)

The LDAPAuthenticationProvider doesn't seem to have setUsername and setPassword, so find how exactly are the credentials set.

Bozho
@Bozho This is good. But, I would want to obtain these values from a database, not from a properties file.
Jay
@Jay see my update
Bozho
@Bozho cool. your answer is pretty much what I want. Regarding your points: 1) Yes, this is how it is. An admin fill his setting on a UI screen and presses "update settings".2) How do you exactly do this? and why does it depend on the presentation layer? My presentation layer would be jsps (spring mvc). Please share a link on the spring documentation that I can read which relates to this implementation. I am just a novice when it comes to Spring
Jay
upated to show how to do it with spring-mvc
Bozho
@Bozho Thank you a lot. Appreciate your help.
Jay