1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.shiro.web.filter.authc;
20
21 import org.apache.shiro.authc.AuthenticationException;
22 import org.apache.shiro.authc.AuthenticationToken;
23 import org.apache.shiro.authc.UsernamePasswordToken;
24 import org.apache.shiro.subject.Subject;
25 import org.apache.shiro.web.util.WebUtils;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28
29 import javax.servlet.ServletRequest;
30 import javax.servlet.ServletResponse;
31 import javax.servlet.http.HttpServletRequest;
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 public class FormAuthenticationFilter extends AuthenticatingFilter {
60
61
62
63 public static final String DEFAULT_ERROR_KEY_ATTRIBUTE_NAME = "shiroLoginFailure";
64
65 public static final String DEFAULT_USERNAME_PARAM = "username";
66 public static final String DEFAULT_PASSWORD_PARAM = "password";
67 public static final String DEFAULT_REMEMBER_ME_PARAM = "rememberMe";
68
69 private static final Logger log = LoggerFactory.getLogger(FormAuthenticationFilter.class);
70
71 private String usernameParam = DEFAULT_USERNAME_PARAM;
72 private String passwordParam = DEFAULT_PASSWORD_PARAM;
73 private String rememberMeParam = DEFAULT_REMEMBER_ME_PARAM;
74
75 private String failureKeyAttribute = DEFAULT_ERROR_KEY_ATTRIBUTE_NAME;
76
77 public FormAuthenticationFilter() {
78 setLoginUrl(DEFAULT_LOGIN_URL);
79 }
80
81 @Override
82 public void setLoginUrl(String loginUrl) {
83 String previous = getLoginUrl();
84 if (previous != null) {
85 this.appliedPaths.remove(previous);
86 }
87 super.setLoginUrl(loginUrl);
88 if (log.isTraceEnabled()) {
89 log.trace("Adding login url to applied paths.");
90 }
91 this.appliedPaths.put(getLoginUrl(), null);
92 }
93
94 public String getUsernameParam() {
95 return usernameParam;
96 }
97
98
99
100
101
102
103
104 public void setUsernameParam(String usernameParam) {
105 this.usernameParam = usernameParam;
106 }
107
108 public String getPasswordParam() {
109 return passwordParam;
110 }
111
112
113
114
115
116
117
118 public void setPasswordParam(String passwordParam) {
119 this.passwordParam = passwordParam;
120 }
121
122 public String getRememberMeParam() {
123 return rememberMeParam;
124 }
125
126
127
128
129
130
131
132
133
134
135
136 public void setRememberMeParam(String rememberMeParam) {
137 this.rememberMeParam = rememberMeParam;
138 }
139
140 public String getFailureKeyAttribute() {
141 return failureKeyAttribute;
142 }
143
144 public void setFailureKeyAttribute(String failureKeyAttribute) {
145 this.failureKeyAttribute = failureKeyAttribute;
146 }
147
148 protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
149 if (isLoginRequest(request, response)) {
150 if (isLoginSubmission(request, response)) {
151 if (log.isTraceEnabled()) {
152 log.trace("Login submission detected. Attempting to execute login.");
153 }
154 return executeLogin(request, response);
155 } else {
156 if (log.isTraceEnabled()) {
157 log.trace("Login page view.");
158 }
159
160 return true;
161 }
162 } else {
163 if (log.isTraceEnabled()) {
164 log.trace("Attempting to access a path which requires authentication. Forwarding to the " +
165 "Authentication url [" + getLoginUrl() + "]");
166 }
167
168 saveRequestAndRedirectToLogin(request, response);
169 return false;
170 }
171 }
172
173
174
175
176
177
178
179
180
181 @SuppressWarnings({"UnusedDeclaration"})
182 protected boolean isLoginSubmission(ServletRequest request, ServletResponse response) {
183 return (request instanceof HttpServletRequest) && WebUtils.toHttp(request).getMethod().equalsIgnoreCase(POST_METHOD);
184 }
185
186 protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) {
187 String username = getUsername(request);
188 String password = getPassword(request);
189 return createToken(username, password, request, response);
190 }
191
192 protected boolean isRememberMe(ServletRequest request) {
193 return WebUtils.isTrue(request, getRememberMeParam());
194 }
195
196 protected boolean onLoginSuccess(AuthenticationToken token, Subject subject,
197 ServletRequest request, ServletResponse response) throws Exception {
198 issueSuccessRedirect(request, response);
199
200 return false;
201 }
202
203 protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e,
204 ServletRequest request, ServletResponse response) {
205 setFailureAttribute(request, e);
206
207 return true;
208 }
209
210 protected void setFailureAttribute(ServletRequest request, AuthenticationException ae) {
211 String className = ae.getClass().getName();
212 request.setAttribute(getFailureKeyAttribute(), className);
213 }
214
215 protected String getUsername(ServletRequest request) {
216 return WebUtils.getCleanParam(request, getUsernameParam());
217 }
218
219 protected String getPassword(ServletRequest request) {
220 return WebUtils.getCleanParam(request, getPasswordParam());
221 }
222
223
224 }