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