Oh, one final note.  Your form action URL should be the same as your
filter's 'loginUrl':

<form name="loginform" method="post" action='${authc.loginUrl}'>
...

where ${authc.loginUrl] is the same value as configured on the authc
filter in the ini [main] section.

Also, you should probably look at Shiro's sample web application, as
it shows a working example:
http://svn.apache.org/repos/asf/shiro/trunk/samples/

particularly the 'web' module.

Cheers,

Les

On Thu, Feb 17, 2011 at 11:28 AM, Les Hazlewood <[email protected]> wrote:
> Hi Datta,
>
> Assuming your INI config is in a file named shiro.ini at the root of
> the classpath, then you've configured the ShiroFilter correctly in
> web.xml.  Your realm definitions look fine - Shiro will automatically
> find all realms defined in shiro.ini and set them on the
> SecurityManager.  If you want to be explicit, you can configure them
> explicitly:
>
> [main]
> realm1 = ...
> realm2 = ..
> securityManager.realms = $realm1, $realm2
>
> You can read more about INI/object-graph configuration here:
> http://shiro.apache.org/configuration.html
>
> The reason your request does not reach your LoginUser servlet is
> because the 'authc' filter is a
> org.apache.shiro.web.filter.authc.FormAuthenticationFilter instance.
> It will process your logins automatically and redirect users as needed
> based on your configuration.  This means the POST request will always
> be handled by the FormAuthenticationFilter and will never be allowed
> to 'fall through' to a controller or servlet below it.  When using the
> default FormAuthenticationFilter, there is no need for a servlet or
> controller.  All you need to do is configure your application's login
> url (where your form is located).
>
> For example:
>
> [main]
> # define your 2 realms here
> ...
> authc.loginUrl = /login.jsp
>
> If you _don't_ want the FormAuthenticationFilter to process your login
> POST requests, and instead you want to let the requests pass through
> to a servlet or MVC controller, you'll want to redefine the 'authc'
> filter to be a org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter
> instance instead:
>
> [main]
> # realms
> authc = org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter
> authc.loginUrl = /login.jsp
>
> The FormAuthenticationFilter is easiest to use, but the
> PasThruAuthenticationFilter is useful if you need to do additional
> request processing beyond a standard login.  See the
> FormAuthenticationFilter and the PassThruAuthenticationFilter JavaDoc
> for more information.
>
> Finally, when multiple realms are configured, Shiro's default
> authentication strategy is to call each realm.  As long as at least
> one of those realms authenticates successfully, the authentication
> will be successful.  You can see this happen by using your debugger
> and putting a breakpoint in the
> org.apache.shiro.authc.pam.ModularRealmAuthenticator class's
> 'doAuthenticate' method.  You can change the strategy if you want to
> as well (AllSuccessfulStrategy, FirstSuccessfulStrategy, etc - see the
> ModularRealmAuthenticator JavaDoc for more).
>
> HTH,
>
> --
> Les Hazlewood
> Founder, Katasoft, Inc.
> Application Security Products & Professional Apache Shiro Support and 
> Training:
> http://www.katasoft.com
>
> On Thu, Feb 17, 2011 at 5:53 AM, Datta <[email protected]> wrote:
>>
>> Hello Friends:
>> I am trying to use Active Directory Realm in my web application
>> I have to authenticate users against 2 Active Directory
>> Need help with configuration?
>>
>> Questions:
>> 1. First when the form is submitted, request does not reach LoginUser
>> servlet? (Unable to figure out whats wrong with .ini)
>> After disabling filter, request reaches Servlet, but realms are not
>> available.:(
>> 2. How do I know which realm is used by LoginUser servlet?
>> 3. Where do I specifiy so that these realms are available to
>> SecurityManager/DefaultWebSecurityManager?
>> 4. I tried the example here
>> http://www.ibm.com/developerworks/web/library/wa-apacheshiro/
>> It works well but with only 1 realm
>>
>>
>> Below is my shiro.ini, login.jsp, web.xml, login servlets doPost Method
>> [main]
>> sirRealm = org.apache.shiro.realm.activedirectory.ActiveDirectoryRealm
>> sirRealm.systemUsername = xxxx
>> sirRealm.systemPassword = xxx
>> sirRealm.searchBase = OU=IT,OU=MA-Users,DC=cinfotec,DC=corp
>> sirRealm.url = ldap://ad0.cinfotec.corp:389/
>>
>> xmrRealm = org.apache.shiro.realm.activedirectory.ActiveDirectoryRealm
>> xmrRealm.systemUsername = xxxx
>> xmrRealm.systemPassword = xxx
>> xmrRealm.searchBase = OU=BU,OU=MA-Users,DC=cinfotec,DC=corp
>> xmrRealm.url = ldap://ad1.cinfotec.corp:389/
>>
>> authc.loginUrl = /login.jsp
>> [urls]
>> # make sure the end-user is authenticated.  If not, redirect to the
>> 'authc.loginUrl' above,
>> # and after successful authentication, redirect them back to the original
>> account page they
>> # were trying to view:
>> /** = authc
>> ---------------------------------------------------------------
>> login.jsp
>> <form name="loginform" method="post" action='LoginUser'>
>>    <table align="left" border="0" cellspacing="0" cellpadding="3">
>>        <tr>
>>            <td>Username:</td>
>>            <td><input type="text" name="username" maxlength="30"></td>
>>        </tr>
>>        <tr>
>>            <td>Password:</td>
>>            <td><input type="password" name="password" maxlength="30"></td>
>>        </tr>
>>        <tr>
>>            <td colspan="2" align="left"><input type="checkbox"
>> name="rememberMe">Remember Me</td>
>>        </tr>
>>        <tr>
>>            <td colspan="2" align="right"><input type="submit" name="submit"
>> value="Login"></td>
>>        </tr>
>>    </table>
>> </form>
>> ---------------------------------------------------------------
>> web.xml
>>    <filter>
>>        <filter-name>ShiroFilter</filter-name>
>>
>> <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
>>    </filter>
>>    <filter-mapping>
>>        <filter-name>ShiroFilter</filter-name>
>>        <url-pattern>/*</url-pattern>
>>    </filter-mapping>
>>
>>    <servlet>
>>        <servlet-name>LoginUser</servlet-name>
>>        <display-name>LoginUser</display-name>
>>        <description>Servlet to autenticate User agains AD</description>
>>        <servlet-class>com.siriusxm.security.Login</servlet-class>
>>    </servlet>
>>    <servlet-mapping>
>>        <servlet-name>LoginUser</servlet-name>
>>        <url-pattern>/LoginUser</url-pattern>
>>    </servlet-mapping>
>>
>> ---------------------------------------------------------------
>> LoginUser Servlet doPost
>>
>>    public void doPost(HttpServletRequest request, HttpServletResponse
>> response) throws ServletException, IOException {
>>        String url = "/login.jsp"; // Get the login page url fromm
>> properties file
>>        String username = request.getParameter("username");
>>        String password = request.getParameter("password");
>>        UsernamePasswordToken token =
>>                new UsernamePasswordToken(username, password);
>>
>>        try {
>>        Subject subject = SecurityUtils.getSubject();
>>        subject.login(token);
>>        //token.clear();
>>        url = "/secure/index.jsp";
>>
>>        } catch (AuthenticationException e) {
>>            logger.error("Error:" + e.getMessage());
>>            e.printStackTrace();
>>        }
>>        RequestDispatcher dispatcher =
>>             getServletContext().getRequestDispatcher(url);
>>
>>        dispatcher.forward(request, response);
>>
>>        }
>> --
>> View this message in context: 
>> http://shiro-user.582556.n2.nabble.com/Help-with-configuring-mulitple-ActiveDirectory-in-web-app-tp6035984p6035984.html
>> Sent from the Shiro User mailing list archive at Nabble.com.

Reply via email to