View Javadoc

1   package com.atlassian.sal.api.auth;
2   
3   import java.io.Serializable;
4   import java.security.Principal;
5   
6   import javax.servlet.http.HttpServletRequest;
7   import javax.servlet.http.HttpServletResponse;
8   
9   import com.atlassian.sal.api.message.Message;
10  
11  /**
12   * Authenticates requests
13   *
14   * @since 2.0
15   */
16  public interface Authenticator
17  {
18      /**
19       * Authenticates a request
20       * @param request The request
21       * @param response The response
22       * @return The result of the authentication
23       */
24      Result authenticate(HttpServletRequest request, HttpServletResponse response);
25  
26      /**
27       * Encapsulates the results of an authentication attempt.  Includes the result status, any problem that
28       * occurred, and possibly the authenticated users {@link Principal}.
29       */
30      static class Result
31      {
32          private final Result.Status status;
33          private final Message message;
34          private final Principal principal;
35  
36          Result(final Result.Status status, final Message message)
37          {
38              this(status, message, null);
39          }
40  
41          Result(final Result.Status status, final Message message, final Principal principal)
42          {
43              if (status == null)
44              {
45                  throw new NullPointerException("status");
46              }
47              if (message == null)
48              {
49                  throw new NullPointerException("message");
50              }
51              this.status = status;
52              this.message = message;
53              this.principal = principal;
54          }
55  
56          public Result.Status getStatus()
57          {
58              return status;
59          }
60  
61          public String getMessage()
62          {
63              return message.toString();
64          }
65  
66          public Principal getPrincipal()
67          {
68              return principal;
69          }
70  
71          public static enum Status
72          {
73              SUCCESS("success"),
74              FAILED("failed"),
75              ERROR("error"),
76              NO_ATTEMPT("no attempt");
77  
78              private final String name;
79  
80              private Status(final String name)
81              {
82                  this.name = name;
83              }
84  
85              @Override
86              public String toString()
87              {
88                  return name;
89              }
90          }
91  
92          private static final Message NO_ATTEMPT_MESSAGE = new Message()
93          {
94              public Serializable[] getArguments()
95              {
96                  return null;
97              }
98  
99              public String getKey()
100             {
101                 return "No authentication attempted";
102             }
103         };
104 
105         private static final Message SUCCESS_MESSAGE = new Message()
106         {
107             public Serializable[] getArguments()
108             {
109                 return null;
110             }
111 
112             public String getKey()
113             {
114                 return "Successful authentication";
115             }
116         };
117 
118         public static final class NoAttempt extends Result
119         {
120             public NoAttempt()
121             {
122                 super(Status.NO_ATTEMPT, NO_ATTEMPT_MESSAGE);
123             }
124         }
125 
126         public static final class Error extends Result
127         {
128             public Error(final Message message)
129             {
130                 super(Status.ERROR, message);
131             }
132         }
133 
134         public static final class Failure extends Result
135         {
136             public Failure(final Message message)
137             {
138                 super(Status.FAILED, message);
139             }
140         }
141 
142         public static final class Success extends Result
143         {
144             /**
145              * Construct a success result for a particular principal.
146              *
147              * @param principal the successfully-authenticated principal
148              * @deprecated since 2.0.10, use {@link Success#Success(Message, Principal)}
149              */
150             @Deprecated
151             public Success(final Principal principal)
152             {
153                 this(SUCCESS_MESSAGE, principal);
154             }
155 
156             /**
157              * Construct a success result for a particular principal with a result message.
158              *
159              * @param message a message indicating the success of this result
160              * @param principal the successfully-authenticated principal
161              * @since 2.0.7
162              */
163             public Success(final Message message, final Principal principal)
164             {
165                 super(Status.SUCCESS, message, principal);
166             }
167         }
168     }
169 }