View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
16  //  ========================================================================
17  //
18  
19  package org.eclipse.jetty.security;
20  
21  import java.io.IOException;
22  
23  import org.eclipse.jetty.security.PropertyUserStore.UserListener;
24  import org.eclipse.jetty.server.UserIdentity;
25  import org.eclipse.jetty.util.Scanner;
26  import org.eclipse.jetty.util.log.Log;
27  import org.eclipse.jetty.util.log.Logger;
28  import org.eclipse.jetty.util.resource.Resource;
29  import org.eclipse.jetty.util.security.Credential;
30  
31  /* ------------------------------------------------------------ */
32  /**
33   * Properties User Realm.
34   * 
35   * An implementation of UserRealm that stores users and roles in-memory in HashMaps.
36   * <P>
37   * Typically these maps are populated by calling the load() method or passing a properties resource to the constructor. The format of the properties file is:
38   * 
39   * <PRE>
40   *  username: password [,rolename ...]
41   * </PRE>
42   * 
43   * Passwords may be clear text, obfuscated or checksummed. The class com.eclipse.Util.Password should be used to generate obfuscated passwords or password
44   * checksums.
45   * 
46   * If DIGEST Authentication is used, the password must be in a recoverable format, either plain text or OBF:.
47   */
48  public class HashLoginService extends MappedLoginService implements UserListener
49  {
50      private static final Logger LOG = Log.getLogger(HashLoginService.class);
51  
52      private PropertyUserStore _propertyUserStore;
53      private String _config;
54      private Resource _configResource;
55      private Scanner _scanner;
56      private int _refreshInterval = 0;// default is not to reload
57  
58      /* ------------------------------------------------------------ */
59      public HashLoginService()
60      {
61      }
62  
63      /* ------------------------------------------------------------ */
64      public HashLoginService(String name)
65      {
66          setName(name);
67      }
68  
69      /* ------------------------------------------------------------ */
70      public HashLoginService(String name, String config)
71      {
72          setName(name);
73          setConfig(config);
74      }
75  
76      /* ------------------------------------------------------------ */
77      public String getConfig()
78      {
79          return _config;
80      }
81  
82      /* ------------------------------------------------------------ */
83      public void getConfig(String config)
84      {
85          _config = config;
86      }
87  
88      /* ------------------------------------------------------------ */
89      public Resource getConfigResource()
90      {
91          return _configResource;
92      }
93  
94      /* ------------------------------------------------------------ */
95      /**
96       * Load realm users from properties file. The property file maps usernames to password specs followed by an optional comma separated list of role names.
97       * 
98       * @param config
99       *            Filename or url of user properties file.
100      */
101     public void setConfig(String config)
102     {
103         _config = config;
104     }
105 
106     /* ------------------------------------------------------------ */
107     public void setRefreshInterval(int msec)
108     {
109         _refreshInterval = msec;
110     }
111 
112     /* ------------------------------------------------------------ */
113     public int getRefreshInterval()
114     {
115         return _refreshInterval;
116     }
117 
118     /* ------------------------------------------------------------ */
119     @Override
120     protected UserIdentity loadUser(String username)
121     {
122         return null;
123     }
124 
125     /* ------------------------------------------------------------ */
126     @Override
127     public void loadUsers() throws IOException
128     {
129         // TODO: Consider refactoring MappedLoginService to not have to override with unused methods
130     }
131 
132     /* ------------------------------------------------------------ */
133     /**
134      * @see org.eclipse.jetty.util.component.AbstractLifeCycle#doStart()
135      */
136     protected void doStart() throws Exception
137     {
138         super.doStart();
139         
140         if (_propertyUserStore == null)
141         {
142             if(LOG.isDebugEnabled())
143                 LOG.debug("doStart: Starting new PropertyUserStore. PropertiesFile: " + _config + " refreshInterval: " + _refreshInterval);
144             
145             _propertyUserStore = new PropertyUserStore();
146             _propertyUserStore.setRefreshInterval(_refreshInterval);
147             _propertyUserStore.setConfig(_config);
148             _propertyUserStore.registerUserListener(this);
149             _propertyUserStore.start();
150         }
151     }
152 
153     /* ------------------------------------------------------------ */
154     /**
155      * @see org.eclipse.jetty.util.component.AbstractLifeCycle#doStop()
156      */
157     protected void doStop() throws Exception
158     {
159         super.doStop();
160         if (_scanner != null)
161             _scanner.stop();
162         _scanner = null;
163     }
164     
165     /* ------------------------------------------------------------ */
166     public void update(String userName, Credential credential, String[] roleArray)
167     {
168         if (LOG.isDebugEnabled())
169             LOG.debug("update: " + userName + " Roles: " + roleArray.length);
170         putUser(userName,credential,roleArray);
171     }
172 
173     /* ------------------------------------------------------------ */
174     public void remove(String userName)
175     {
176         if (LOG.isDebugEnabled())
177             LOG.debug("remove: " + userName);
178         removeUser(userName);
179     }
180 }