Produced by Araxis Merge on 11/20/2017 2:16:16 PM GMT Standard Time. See www.araxis.com for information about Merge. This report uses XHTML and CSS2, and is best viewed with a modern standards-compliant browser. For optimum results when printing this report, use landscape orientation and enable printing of background images and colours in your browser.
| # | Location | File | Last Modified |
|---|---|---|---|
| 1 | C:\Merge Test Files\8.0.47\java\org\apache\catalina\authenticator | AuthenticatorBase.java | Fri Sep 29 16:53:28 2017 UTC |
| 2 | C:\Merge Test Files\8.5.23\java\org\apache\catalina\authenticator | AuthenticatorBase.java | Thu Sep 28 11:32:16 2017 UTC |
| Description | Between Files 1 and 2 |
|
|---|---|---|
| Text Blocks | Lines | |
| Unchanged | 111 | 1516 |
| Changed | 65 | 489 |
| Inserted | 20 | 247 |
| Removed | 25 | 26 |
| Whitespace | Consecutive whitespace is treated as a single space |
|---|---|
| Character case | Differences in character case are significant |
| Line endings | Differences in line endings (CR and LF characters) are ignored |
| CR/LF characters | Not shown in the comparison detail |
No regular expressions were active.
| 1 | /* | 1 | /* | |||
| 2 | * License d to the A pache Soft ware Found ation (ASF ) under on e or more | 2 | * License d to the A pache Soft ware Found ation (ASF ) under on e or more | |||
| 3 | * contrib utor licen se agreeme nts. See the NOTICE file dist ributed wi th | 3 | * contrib utor licen se agreeme nts. See the NOTICE file dist ributed wi th | |||
| 4 | * this wo rk for add itional in formation regarding copyright ownership. | 4 | * this wo rk for add itional in formation regarding copyright ownership. | |||
| 5 | * The ASF licenses this file to You und er the Apa che Licens e, Version 2.0 | 5 | * The ASF licenses this file to You und er the Apa che Licens e, Version 2.0 | |||
| 6 | * (the "L icense"); you may no t use this file exce pt in comp liance wit h | 6 | * (the "L icense"); you may no t use this file exce pt in comp liance wit h | |||
| 7 | * the Lic ense. You may obtai n a copy o f the Lice nse at | 7 | * the Lic ense. You may obtai n a copy o f the Lice nse at | |||
| 8 | * | 8 | * | |||
| 9 | * ht tp://www.a pache.org/ licenses/L ICENSE-2.0 | 9 | * ht tp://www.a pache.org/ licenses/L ICENSE-2.0 | |||
| 10 | * | 10 | * | |||
| 11 | * Unless required b y applicab le law or agreed to in writing , software | 11 | * Unless required b y applicab le law or agreed to in writing , software | |||
| 12 | * distrib uted under the Licen se is dist ributed on an "AS IS " BASIS, | 12 | * distrib uted under the Licen se is dist ributed on an "AS IS " BASIS, | |||
| 13 | * WITHOUT WARRANTIE S OR CONDI TIONS OF A NY KIND, e ither expr ess or imp lied. | 13 | * WITHOUT WARRANTIE S OR CONDI TIONS OF A NY KIND, e ither expr ess or imp lied. | |||
| 14 | * See the License f or the spe cific lang uage gover ning permi ssions and | 14 | * See the License f or the spe cific lang uage gover ning permi ssions and | |||
| 15 | * limitat ions under the Licen se. | 15 | * limitat ions under the Licen se. | |||
| 16 | */ | 16 | */ | |||
| 17 | package or g.apache.c atalina.au thenticato r; | 17 | package or g.apache.c atalina.au thenticato r; | |||
| 18 | 18 | |||||
| 19 | import jav a.io.IOExc eption; | 19 | import jav a.io.IOExc eption; | |||
| 20 | import jav a.security .Principal ; | 20 | import jav a.security .Principal ; | |||
| 21 | import jav a.security .cert.X509 Certificat e; | 21 | import jav a.security .cert.X509 Certificat e; | |||
| 22 | import jav a.text.Sim pleDateFor mat; | 22 | import jav a.text.Sim pleDateFor mat; | |||
| 23 | import jav a.util.Dat e; | 23 | import jav a.util.Dat e; | |||
| 24 | import jav a.util.Loc ale; | 24 | import jav a.util.Loc ale; | |||
| 25 | import jav a.util.Map ; | |||||
| 26 | import jav a.util.Set ; | |||||
| 25 | 27 | |||||
| 28 | import jav ax.securit y.auth.Sub ject; | |||||
| 29 | import jav ax.securit y.auth.cal lback.Call backHandle r; | |||||
| 30 | import jav ax.securit y.auth.mes sage.AuthE xception; | |||||
| 31 | import jav ax.securit y.auth.mes sage.AuthS tatus; | |||||
| 32 | import jav ax.securit y.auth.mes sage.Messa geInfo; | |||||
| 33 | import jav ax.securit y.auth.mes sage.confi g.AuthConf igFactory; | |||||
| 34 | import jav ax.securit y.auth.mes sage.confi g.AuthConf igProvider ; | |||||
| 35 | import jav ax.securit y.auth.mes sage.confi g.ClientAu thConfig; | |||||
| 36 | import jav ax.securit y.auth.mes sage.confi g.Registra tionListen er; | |||||
| 37 | import jav ax.securit y.auth.mes sage.confi g.ServerAu thConfig; | |||||
| 38 | import jav ax.securit y.auth.mes sage.confi g.ServerAu thContext; | |||||
| 39 | import jav ax.servlet .ServletCo ntext; | |||||
| 26 | import jav ax.servlet .ServletEx ception; | 40 | import jav ax.servlet .ServletEx ception; | |||
| 27 | import jav ax.servlet .http.Cook ie; | 41 | import jav ax.servlet .http.Cook ie; | |||
| 28 | import jav ax.servlet .http.Http ServletReq uest; | 42 | import jav ax.servlet .http.Http ServletReq uest; | |||
| 29 | import jav ax.servlet .http.Http ServletRes ponse; | 43 | import jav ax.servlet .http.Http ServletRes ponse; | |||
| 30 | 44 | |||||
| 31 | import org .apache.ca talina.Aut henticator ; | 45 | import org .apache.ca talina.Aut henticator ; | |||
| 32 | import org .apache.ca talina.Con tainer; | 46 | import org .apache.ca talina.Con tainer; | |||
| 33 | import org .apache.ca talina.Con text; | 47 | import org .apache.ca talina.Con text; | |||
| 34 | import org .apache.ca talina.Glo bals; | 48 | import org .apache.ca talina.Glo bals; | |||
| 35 | import org .apache.ca talina.Lif ecycleExce ption; | 49 | import org .apache.ca talina.Lif ecycleExce ption; | |||
| 36 | import org .apache.ca talina.Man ager; | 50 | import org .apache.ca talina.Man ager; | |||
| 37 | import org .apache.ca talina.Rea lm; | 51 | import org .apache.ca talina.Rea lm; | |||
| 38 | import org .apache.ca talina.Ses sion; | 52 | import org .apache.ca talina.Ses sion; | |||
| 39 | import org .apache.ca talina.Tom catPrincip al; | 53 | import org .apache.ca talina.Tom catPrincip al; | |||
| 40 | import org .apache.ca talina.Val ve; | 54 | import org .apache.ca talina.Val ve; | |||
| 41 | import org .apache.ca talina.Wra pper; | 55 | import org .apache.ca talina.Wra pper; | |||
| 56 | import org .apache.ca talina.aut henticator .jaspic.Ca llbackHand lerImpl; | |||||
| 57 | import org .apache.ca talina.aut henticator .jaspic.Me ssageInfoI mpl; | |||||
| 42 | import org .apache.ca talina.con nector.Req uest; | 58 | import org .apache.ca talina.con nector.Req uest; | |||
| 43 | import org .apache.ca talina.con nector.Res ponse; | 59 | import org .apache.ca talina.con nector.Res ponse; | |||
| 44 | import org .apache.ca talina.rea lm.Generic Principal; | 60 | import org .apache.ca talina.rea lm.Generic Principal; | |||
| 45 | import org .apache.ca talina.uti l.SessionI dGenerator Base; | 61 | import org .apache.ca talina.uti l.SessionI dGenerator Base; | |||
| 46 | import org .apache.ca talina.uti l.Standard SessionIdG enerator; | 62 | import org .apache.ca talina.uti l.Standard SessionIdG enerator; | |||
| 47 | import org .apache.ca talina.val ves.ValveB ase; | 63 | import org .apache.ca talina.val ves.ValveB ase; | |||
| 48 | import org .apache.co yote.Actio nCode; | 64 | import org .apache.co yote.Actio nCode; | |||
| 49 | import org .apache.ju li.logging .Log; | 65 | import org .apache.ju li.logging .Log; | |||
| 50 | import org .apache.ju li.logging .LogFactor y; | 66 | import org .apache.ju li.logging .LogFactor y; | |||
| 51 | import org .apache.to mcat.util. ExceptionU tils; | 67 | import org .apache.to mcat.util. ExceptionU tils; | |||
| 52 | import org .apache.to mcat.util. descriptor .web.Login Config; | 68 | import org .apache.to mcat.util. descriptor .web.Login Config; | |||
| 53 | import org .apache.to mcat.util. descriptor .web.Secur ityConstra int; | 69 | import org .apache.to mcat.util. descriptor .web.Secur ityConstra int; | |||
| 54 | import org .apache.to mcat.util. http.FastH ttpDateFor mat; | 70 | import org .apache.to mcat.util. http.FastH ttpDateFor mat; | |||
| 55 | import org .apache.to mcat.util. res.String Manager; | 71 | import org .apache.to mcat.util. res.String Manager; | |||
| 56 | 72 | |||||
| 57 | ||||||
| 58 | /** | 73 | /** | |||
| 59 | * Basic i mplementat ion of the <b>Valve< /b> interf ace that e nforces th e | 74 | * Basic i mplementat ion of the <b>Valve< /b> interf ace that e nforces th e | |||
| 60 | * <code>& lt;securit y-constrai nt></co de> elemen ts in the web applic ation | 75 | * <code>& lt;securit y-constrai nt></co de> elemen ts in the web applic ation | |||
| 61 |
* deploym
ent descri
ptor.
This funct
ionality i
s implemen
ted as a V
alve
|
76 | * deploym ent descri ptor. This functiona lity is im plemented as a Valve so that | |||
| 62 |
*
so that
it can be
omitted in
environme
nts that d
o not requ
ire these
|
77 |
*
|
|||
| 63 |
*
features.
Individual
implement
ations of
each suppo
rted authe
ntication
|
78 |
*
|
|||
| 64 | * method can subclass t his base c lass as re quired. | 79 |
*
|
|||
| 65 | * <p> | 80 | * <p> | |||
| 66 |
* <b>USAG
E CONSTRAI
NT</b>:
When this
class is u
tilized, t
he Context
to
|
81 | * <b>USAG E CONSTRAI NT</b>: Wh en this cl ass is uti lized, the Context t o which it | |||
| 67 |
*
which it
is attache
d (or a pa
rent Conta
iner in a
hierarchy)
must have
an
|
82 |
*
|
|||
| 68 |
*
associated
Realm that
can be us
ed for aut
henticatin
g users an
d enumerat
ing
|
83 |
*
|
|||
| 69 | * the roles to which they have been assigned. | 84 |
*
|
|||
| 70 | * <p> | 85 | * <p> | |||
| 71 | * <b>USAG E CONSTRAI NT</b>: T his Valve is only us eful when processing HTTP | 86 | * <b>USAG E CONSTRAI NT</b>: Th is Valve i s only use ful when p rocessing HTTP | |||
| 72 | * request s. Reques ts of any other type will simp ly be pass ed through . | 87 | * request s. Request s of any o ther type will simpl y be passe d through. | |||
| 73 | * | 88 | * | |||
| 74 | * @author Craig R. McClanahan | 89 | * @author Craig R. McClanahan | |||
| 75 | */ | 90 | */ | |||
| 76 | public abs tract clas s Authenti catorBase extends Va lveBase | 91 | public abs tract clas s Authenti catorBase extends Va lveBase | |||
| 77 |
implements
Authentic
ator
|
92 | implements Authentic ator , Registra tionListen er { | |||
| 78 | 93 | |||||
| 79 | privat e static f inal Log l og = LogFa ctory.getL og(Authent icatorBase .class); | 94 | privat e static f inal Log l og = LogFa ctory.getL og(Authent icatorBase .class); | |||
| 80 | 95 | |||||
| 96 | /** | |||||
| 97 | * "Ex pires" hea der always set to Da te(1), so generate o nce only | |||||
| 98 | */ | |||||
| 99 | privat e static f inal Strin g DATE_ONE = | |||||
| 100 | (new Sim pleDateFor mat(FastHt tpDateForm at.RFC1123 _DATE, Loc ale.US)).f ormat(new Date(1)); | |||||
| 81 | 101 | |||||
| 82 | //---- ---------- ---------- ---------- ---------- ---------- Construct or | 102 | privat e static f inal AuthC onfigProvi der NO_PRO VIDER_AVAI LABLE = ne w NoOpAuth ConfigProv ider(); | |||
| 83 | public Authentic atorBase() { | |||||
| 84 | su per(true); | |||||
| 85 | } | |||||
| 86 | ||||||
| 87 | // --- ---------- ---------- ---------- ---------- ---------- Instance Variables | |||||
| 88 | 103 | |||||
| 104 | /** | |||||
| 105 | * The string ma nager for this packa ge. | |||||
| 106 | */ | |||||
| 107 | protec ted static final Str ingManager sm = Stri ngManager. getManager (Authentic atorBase.c lass); | |||||
| 89 | 108 | |||||
| 90 | /** | 109 | /** | |||
| 91 | * Aut henticatio n header | 110 | * Aut henticatio n header | |||
| 92 | */ | 111 | */ | |||
| 93 | protec ted static final Str ing AUTH_H EADER_NAME = "WWW-Au thenticate "; | 112 | protec ted static final Str ing AUTH_H EADER_NAME = "WWW-Au thenticate "; | |||
| 94 | 113 | |||||
| 95 | /** | 114 | /** | |||
| 96 | * Def ault authe ntication realm name . | 115 | * Def ault authe ntication realm name . | |||
| 97 | */ | 116 | */ | |||
| 98 | protec ted static final Str ing REALM_ NAME = "Au thenticati on require d"; | 117 | protec ted static final Str ing REALM_ NAME = "Au thenticati on require d"; | |||
| 99 | 118 | |||||
| 119 | protec ted static String ge tRealmName (Context c ontext) { | |||||
| 120 | if (context == null) { | |||||
| 121 | // Very unlikely | |||||
| 122 | return R EALM_NAME; | |||||
| 123 | } | |||||
| 124 | ||||||
| 125 | Lo ginConfig config = c ontext.get LoginConfi g(); | |||||
| 126 | if (config = = null) { | |||||
| 127 | return R EALM_NAME; | |||||
| 128 | } | |||||
| 129 | ||||||
| 130 | St ring resul t = config .getRealmN ame(); | |||||
| 131 | if (result = = null) { | |||||
| 132 | return R EALM_NAME; | |||||
| 133 | } | |||||
| 134 | ||||||
| 135 | re turn resul t; | |||||
| 136 | } | |||||
| 137 | ||||||
| 138 | // --- ---------- ---------- ---------- ---------- ---------- - Construc tor | |||||
| 139 | ||||||
| 140 | public Authentic atorBase() { | |||||
| 141 | su per(true); | |||||
| 142 | } | |||||
| 143 | ||||||
| 144 | // --- ---------- ---------- ---------- ---------- ---------- Instance Variables | |||||
| 145 | ||||||
| 100 | /** | 146 | /** | |||
| 101 | * Sho uld a sess ion always be used o nce a user is authen ticated? T his may | 147 | * Sho uld a sess ion always be used o nce a user is authen ticated? T his may | |||
| 102 | * off er some pe rformance benefits s ince the s ession can then be u sed to | 148 | * off er some pe rformance benefits s ince the s ession can then be u sed to | |||
| 103 | * cac he the aut henticated Principal , hence re moving the need to | 149 | * cac he the aut henticated Principal , hence re moving the need to | |||
| 104 | * aut henticate the user v ia the Rea lm on ever y request. This may be of help | 150 | * aut henticate the user v ia the Rea lm on ever y request. This may be of help | |||
| 105 | * for combinati ons such a s BASIC au thenticati on used wi th the JND IRealm or | 151 | * for combinati ons such a s BASIC au thenticati on used wi th the JND IRealm or | |||
| 106 | * Dat aSourceRea lms. Howev er there w ill also b e the perf ormance co st of | 152 | * Dat aSourceRea lms. Howev er there w ill also b e the perf ormance co st of | |||
| 107 | * cre ating and GC'ing the session. By default , a sessio n will not be | 153 | * cre ating and GC'ing the session. By default , a sessio n will not be | |||
| 108 | * cre ated. | 154 | * cre ated. | |||
| 109 | */ | 155 | */ | |||
| 110 | protec ted boolea n alwaysUs eSession = false; | 156 | protec ted boolea n alwaysUs eSession = false; | |||
| 111 | 157 | |||||
| 112 | ||||||
| 113 | /** | 158 | /** | |||
| 114 |
* Should w
e cache au
thenticate
d Principa
ls if the
request is
part of
|
159 | * Should w e cache au thenticate d Principa ls if the request is part of an | |||
| 115 | * an HTTP sessi on? | 160 |
*
|
|||
| 116 | */ | 161 | */ | |||
| 117 | protec ted boolea n cache = true; | 162 | protec ted boolea n cache = true; | |||
| 118 | 163 | |||||
| 119 | ||||||
| 120 | /** | 164 | /** | |||
| 121 | * Sho uld the se ssion ID, if any, be changed u pon a succ essful | 165 | * Sho uld the se ssion ID, if any, be changed u pon a succ essful | |||
| 122 | * aut henticatio n to preve nt a sessi on fixatio n attack? | 166 | * aut henticatio n to preve nt a sessi on fixatio n attack? | |||
| 123 | */ | 167 | */ | |||
| 124 | protec ted boolea n changeSe ssionIdOnA uthenticat ion = true ; | 168 | protec ted boolea n changeSe ssionIdOnA uthenticat ion = true ; | |||
| 125 | 169 | |||||
| 126 | /** | 170 | /** | |||
| 127 | * The Context t o which th is Valve i s attached . | 171 | * The Context t o which th is Valve i s attached . | |||
| 128 | */ | 172 | */ | |||
| 129 | protec ted Contex t context = null; | 173 | protec ted Contex t context = null; | |||
| 130 | 174 | |||||
| 131 | ||||||
| 132 | /** | 175 | /** | |||
| 133 |
* Flag to
determine
if we disa
ble proxy
caching, o
r leave th
e issue
|
176 | * Flag to determine if we disa ble proxy caching, o r leave th e issue up to | |||
| 134 | * up to the webapp developer . | 177 |
*
|
|||
| 135 | */ | 178 | */ | |||
| 136 | protec ted boolea n disableP roxyCachin g = true; | 179 | protec ted boolea n disableP roxyCachin g = true; | |||
| 137 | 180 | |||||
| 138 | /** | 181 | /** | |||
| 139 | * Fla g to deter mine if we disable p roxy cachi ng with he aders inco mpatible | 182 | * Fla g to deter mine if we disable p roxy cachi ng with he aders inco mpatible | |||
| 140 | * wit h IE. | 183 | * wit h IE. | |||
| 141 | */ | 184 | */ | |||
| 142 | protec ted boolea n securePa gesWithPra gma = fals e; | 185 | protec ted boolea n securePa gesWithPra gma = fals e; | |||
| 143 | 186 | |||||
| 144 | /** | 187 | /** | |||
| 145 | * The Java clas s name of the secure random nu mber gener ator class to be | 188 | * The Java clas s name of the secure random nu mber gener ator class to be | |||
| 146 | * use d when gen erating SS O session identifier s. The ran dom number generator | 189 | * use d when gen erating SS O session identifier s. The ran dom number generator | |||
| 147 | * cla ss must be self-seed ing and ha ve a zero- argument c onstructor . If not | 190 | * cla ss must be self-seed ing and ha ve a zero- argument c onstructor . If not | |||
| 148 | * spe cified, an instance of {@link java.secur ity.Secure Random} wi ll be | 191 | * spe cified, an instance of {@link java.secur ity.Secure Random} wi ll be | |||
| 149 | * gen erated. | 192 | * gen erated. | |||
| 150 | */ | 193 | */ | |||
| 151 | protec ted String secureRan domClass = null; | 194 | protec ted String secureRan domClass = null; | |||
| 152 | 195 | |||||
| 153 | /** | 196 | /** | |||
| 154 | * The name of t he algorit hm to use to create instances of | 197 | * The name of t he algorit hm to use to create instances of | |||
| 155 | * {@l ink java.s ecurity.Se cureRandom } which ar e used to generate S SO session | 198 | * {@l ink java.s ecurity.Se cureRandom } which ar e used to generate S SO session | |||
| 156 | * IDs . If no al gorithm is specified , SHA1PRNG is used. To use the platform | 199 | * IDs . If no al gorithm is specified , SHA1PRNG is used. To use the platform | |||
| 157 | * def ault (whic h may be S HA1PRNG), specify th e empty st ring. If a n invalid | 200 | * def ault (whic h may be S HA1PRNG), specify th e empty st ring. If a n invalid | |||
| 158 | * alg orithm and /or provid er is spec ified the SecureRand om instanc es will be | 201 | * alg orithm and /or provid er is spec ified the SecureRand om instanc es will be | |||
| 159 | * cre ated using the defau lts. If th at fails, the Secure Random ins tances | 202 | * cre ated using the defau lts. If th at fails, the Secure Random ins tances | |||
| 160 | * wil l be creat ed using p latform de faults. | 203 | * wil l be creat ed using p latform de faults. | |||
| 161 | */ | 204 | */ | |||
| 162 | protec ted String secureRan domAlgorit hm = "SHA1 PRNG"; | 205 | protec ted String secureRan domAlgorit hm = "SHA1 PRNG"; | |||
| 163 | 206 | |||||
| 164 | /** | 207 | /** | |||
| 165 | * The name of t he provide r to use t o create i nstances o f | 208 | * The name of t he provide r to use t o create i nstances o f | |||
| 166 | * {@l ink java.s ecurity.Se cureRandom } which ar e used to generate s ession SSO | 209 | * {@l ink java.s ecurity.Se cureRandom } which ar e used to generate s ession SSO | |||
| 167 | * IDs . If no al gorithm is specified the of SH A1PRNG def ault is us ed. If an | 210 | * IDs . If no al gorithm is specified the of SH A1PRNG def ault is us ed. If an | |||
| 168 | * inv alid algor ithm and/o r provider is specif ied the Se cureRandom instances | 211 | * inv alid algor ithm and/o r provider is specif ied the Se cureRandom instances | |||
| 169 | * wil l be creat ed using t he default s. If that fails, th e SecureRa ndom | 212 | * wil l be creat ed using t he default s. If that fails, th e SecureRa ndom | |||
| 170 | * ins tances wil l be creat ed using p latform de faults. | 213 | * ins tances wil l be creat ed using p latform de faults. | |||
| 171 | */ | 214 | */ | |||
| 172 | protec ted String secureRan domProvide r = null; | 215 | protec ted String secureRan domProvide r = null; | |||
| 173 | 216 | |||||
| 174 | protec ted Sessio nIdGenerat orBase ses sionIdGene rator = nu ll; | 217 | protec ted Sessio nIdGenerat orBase ses sionIdGene rator = nu ll; | |||
| 175 | 218 | |||||
| 176 | /** | 219 | /** | |||
| 177 | * The string ma nager for this packa ge. | 220 | * The Sing leSignOn i mplementat ion in our request p rocessing chain, if there | |||
| 178 | */ | 221 |
* i
|
|||
| 179 | protec ted static final Str ingManager sm = | |||||
| 180 | St ringManage r.getManag er(Constan ts.Package ); | |||||
| 181 | ||||||
| 182 | ||||||
| 183 | /** | |||||
| 184 |
* The Sing
leSignOn i
mplementat
ion in our
request p
rocessing
chain,
|
|||||
| 185 | * i f there i s one. | |||||
| 186 | */ | 222 | */ | |||
| 187 | protec ted Single SignOn sso = null; | 223 | protec ted Single SignOn sso = null; | |||
| 188 | 224 | |||||
| 189 | 225 | privat e volatile String ja spicAppCon textID = n ull; | ||||
| 190 | /** | 226 | privat e volatile AuthConfi gProvider jaspicProv ider = nul l; | |||
| 191 | * "Ex pires" hea der always set to Da te(1), so generate o nce only | |||||
| 192 | */ | |||||
| 193 | privat e static f inal Strin g DATE_ONE = | |||||
| 194 | (n ew SimpleD ateFormat( FastHttpDa teFormat.R FC1123_DAT E, | |||||
| 195 | Locale.US) ).format(n ew Date(1) ); | |||||
| 196 | ||||||
| 197 | ||||||
| 198 | protec ted static String ge tRealmName (Context c ontext) { | |||||
| 199 | if (context == null) { | |||||
| 200 | // Very unlikely | |||||
| 201 | return R EALM_NAME; | |||||
| 202 | } | |||||
| 203 | ||||||
| 204 | Lo ginConfig config = c ontext.get LoginConfi g(); | |||||
| 205 | if (config = = null) { | |||||
| 206 | return R EALM_NAME; | |||||
| 207 | } | |||||
| 208 | ||||||
| 209 | St ring resul t = config .getRealmN ame(); | |||||
| 210 | if (result = = null) { | |||||
| 211 | return R EALM_NAME; | |||||
| 212 | } | |||||
| 213 | ||||||
| 214 | re turn resul t; | |||||
| 215 | } | |||||
| 216 | 227 | |||||
| 217 | 228 | |||||
| 218 | // --- ---------- ---------- ---------- ---------- ---------- -------- P roperties | 229 | // --- ---------- ---------- ---------- ---------- ---------- -------- P roperties | |||
| 219 | 230 | |||||
| 220 | ||||||
| 221 | public boolean g etAlwaysUs eSession() { | 231 | public boolean g etAlwaysUs eSession() { | |||
| 222 | re turn alway sUseSessio n; | 232 | re turn alway sUseSessio n; | |||
| 223 | } | 233 | } | |||
| 224 | 234 | |||||
| 225 | ||||||
| 226 | public void setA lwaysUseSe ssion(bool ean always UseSession ) { | 235 | public void setA lwaysUseSe ssion(bool ean always UseSession ) { | |||
| 227 | th is.alwaysU seSession = alwaysUs eSession; | 236 | th is.alwaysU seSession = alwaysUs eSession; | |||
| 228 | } | 237 | } | |||
| 229 | 238 | |||||
| 230 | ||||||
| 231 | /** | 239 | /** | |||
| 232 | * Ret urn the ca che authen ticated Pr incipals f lag. | 240 | * Ret urn the ca che authen ticated Pr incipals f lag. | |||
| 241 | * | |||||
| 242 | * @re turn <code >true</cod e> if auth enticated Principals will be c ached, | |||||
| 243 | * other wise <code >false</co de> | |||||
| 233 | */ | 244 | */ | |||
| 234 | public boolean g etCache() { | 245 | public boolean g etCache() { | |||
| 235 | 246 |
return
|
||||
| 236 | return ( this.cache ) ; | |||||
| 237 | ||||||
| 238 | } | 247 | } | |||
| 239 | 248 | |||||
| 240 | ||||||
| 241 | /** | 249 | /** | |||
| 242 | * Set the cache authentic ated Princ ipals flag . | 250 | * Set the cache authentic ated Princ ipals flag . | |||
| 243 | * | 251 | * | |||
| 244 | * @param c ache The new c ache flag | 252 |
* @param c
ache
|
|||
| 253 | * Th e new cach e flag | |||||
| 245 | */ | 254 | */ | |||
| 246 | public void setC ache(boole an cache) { | 255 | public void setC ache(boole an cache) { | |||
| 247 | ||||||
| 248 | th is.cache = cache; | 256 | th is.cache = cache; | |||
| 249 | ||||||
| 250 | } | 257 | } | |||
| 251 | 258 | |||||
| 252 | ||||||
| 253 | /** | 259 | /** | |||
| 254 | * Ret urn the Co ntainer to which thi s Valve is attached. | 260 | * Ret urn the Co ntainer to which thi s Valve is attached. | |||
| 255 | */ | 261 | */ | |||
| 256 | @Overr ide | 262 | @Overr ide | |||
| 257 | public Container getContai ner() { | 263 | public Container getContai ner() { | |||
| 258 | 264 |
return
|
||||
| 259 | return ( this.conte xt ) ; | |||||
| 260 | ||||||
| 261 | } | 265 | } | |||
| 262 | 266 | |||||
| 263 | ||||||
| 264 | /** | 267 | /** | |||
| 265 | * Set the Conta iner to wh ich this V alve is at tached. | 268 | * Set the Conta iner to wh ich this V alve is at tached. | |||
| 266 | * | 269 | * | |||
| 267 | * @param con tainer The contai ner to whi ch we are attached | 270 | * @pa ram contai ner | |||
| 271 |
*
|
|||||
| 268 | */ | 272 | */ | |||
| 269 | @Overr ide | 273 | @Overr ide | |||
| 270 | public void setC ontainer(C ontainer c ontainer) { | 274 | public void setC ontainer(C ontainer c ontainer) { | |||
| 271 | 275 | |||||
| 272 | if (containe r != null && !(conta iner insta nceof Cont ext)) { | 276 | if (containe r != null && !(conta iner insta nceof Cont ext)) { | |||
| 273 |
throw new
IllegalArg
umentExcep
tion
|
277 | throw new IllegalArg umentExcep tion (sm.getStr ing("authe nticator.n otContext" )); | |||
| 274 | (sm. getString( "authentic ator.notCo ntext")); | |||||
| 275 | } | 278 | } | |||
| 276 | 279 | |||||
| 277 | su per.setCon tainer(con tainer); | 280 | su per.setCon tainer(con tainer); | |||
| 278 | th is.context = (Contex t) contain er; | 281 | th is.context = (Contex t) contain er; | |||
| 279 | 282 | |||||
| 280 | } | 283 | } | |||
| 281 | 284 | |||||
| 282 | ||||||
| 283 | /** | 285 | /** | |||
| 284 | * Ret urn the fl ag that st ates if we add heade rs to disa ble cachin g by | 286 | * Ret urn the fl ag that st ates if we add heade rs to disa ble cachin g by | |||
| 285 | * pro xies. | 287 | * pro xies. | |||
| 288 | * | |||||
| 289 | * @re turn <code >true</cod e> if the headers wi ll be adde d, otherwi se | |||||
| 290 | * <code >false</co de> | |||||
| 286 | */ | 291 | */ | |||
| 287 | public boolean g etDisableP roxyCachin g() { | 292 | public boolean g etDisableP roxyCachin g() { | |||
| 288 | re turn disab leProxyCac hing; | 293 | re turn disab leProxyCac hing; | |||
| 289 | } | 294 | } | |||
| 290 | 295 | |||||
| 291 | /** | 296 | /** | |||
| 292 | * Set the value of the fl ag that st ates if we add heade rs to disa ble | 297 | * Set the value of the fl ag that st ates if we add heade rs to disa ble | |||
| 293 | * cac hing by pr oxies. | 298 | * cac hing by pr oxies. | |||
| 294 |
*
@param noc
ache
<code>true
</code> if
we add he
aders to d
isable pro
xy
|
299 | * | |||
| 295 | * caching, <code>fals e</code> i f we leave the heade rs alone. | 300 | * @pa ram nocach e | |||
| 301 |
*
|
|||||
| 302 |
*
|
|||||
| 296 | */ | 303 | */ | |||
| 297 | public void setD isableProx yCaching(b oolean noc ache) { | 304 | public void setD isableProx yCaching(b oolean noc ache) { | |||
| 298 | di sableProxy Caching = nocache; | 305 | di sableProxy Caching = nocache; | |||
| 299 | } | 306 | } | |||
| 300 | 307 | |||||
| 301 | /** | 308 | /** | |||
| 302 | * Ret urn the fl ag that st ates, if p roxy cachi ng is disa bled, what headers | 309 | * Ret urn the fl ag that st ates, if p roxy cachi ng is disa bled, what headers | |||
| 303 | * we add to dis able the c aching. | 310 | * we add to dis able the c aching. | |||
| 311 | * | |||||
| 312 | * @re turn <code >true</cod e> if a Pr agma heade r should b e used, ot herwise | |||||
| 313 | * <code >false</co de> | |||||
| 304 | */ | 314 | */ | |||
| 305 | public boolean g etSecurePa gesWithPra gma() { | 315 | public boolean g etSecurePa gesWithPra gma() { | |||
| 306 | re turn secur ePagesWith Pragma; | 316 | re turn secur ePagesWith Pragma; | |||
| 307 | } | 317 | } | |||
| 308 | 318 | |||||
| 309 | /** | 319 | /** | |||
| 310 | * Set the value of the fl ag that st ates what headers we add to di sable | 320 | * Set the value of the fl ag that st ates what headers we add to di sable | |||
| 311 | * pro xy caching . | 321 | * pro xy caching . | |||
| 312 |
*
@param sec
urePagesWi
thPragma
<code>true
</code> if
we add he
aders whic
h
|
322 | * | |||
| 313 |
*
are incomp
atible
with downl
oading off
ice docume
nts in IE
under SSL
but
|
323 | * @pa ram secure PagesWithP ragma | |||
| 314 | * which fix a cach ing proble m in Mozil la. | 324 |
*
|
|||
| 325 |
*
|
|||||
| 326 |
*
|
|||||
| 315 | */ | 327 | */ | |||
| 316 | public void setS ecurePages WithPragma (boolean s ecurePages WithPragma ) { | 328 | public void setS ecurePages WithPragma (boolean s ecurePages WithPragma ) { | |||
| 317 | th is.secureP agesWithPr agma = sec urePagesWi thPragma; | 329 | th is.secureP agesWithPr agma = sec urePagesWi thPragma; | |||
| 318 | } | 330 | } | |||
| 319 | 331 | |||||
| 320 | /** | 332 | /** | |||
| 321 | * Ret urn the fl ag that st ates if we should ch ange the s ession ID of an | 333 | * Ret urn the fl ag that st ates if we should ch ange the s ession ID of an | |||
| 322 | * exi sting sess ion upon s uccessful authentica tion. | 334 | * exi sting sess ion upon s uccessful authentica tion. | |||
| 323 | * | 335 | * | |||
| 324 | * @re turn <code >true</cod e> to chan ge session ID upon s uccessful | 336 | * @re turn <code >true</cod e> to chan ge session ID upon s uccessful | |||
| 325 | * authe ntication, <code>fal se</code> to do not perform th e change. | 337 | * authe ntication, <code>fal se</code> to do not perform th e change. | |||
| 326 | */ | 338 | */ | |||
| 327 | public boolean g etChangeSe ssionIdOnA uthenticat ion() { | 339 | public boolean g etChangeSe ssionIdOnA uthenticat ion() { | |||
| 328 | re turn chang eSessionId OnAuthenti cation; | 340 | re turn chang eSessionId OnAuthenti cation; | |||
| 329 | } | 341 | } | |||
| 330 | 342 | |||||
| 331 | /** | 343 | /** | |||
| 332 | * Set the value of the fl ag that st ates if we should ch ange the s ession ID | 344 | * Set the value of the fl ag that st ates if we should ch ange the s ession ID | |||
| 333 | * of an existin g session upon succe ssful auth entication . | 345 | * of an existin g session upon succe ssful auth entication . | |||
| 334 | * | 346 | * | |||
| 335 |
* @param c
hangeSessi
onIdOnAuth
entication
|
347 | * @param c hangeSessi onIdOnAuth entication <code>tru e</code> t o change | |||
| 336 | * <c ode>true</ code> to c hange sess ion ID upo n successf ul | 348 |
*
session ID
upon succ
essful
authentica
tion, <cod
e>false</c
ode>
|
|||
| 337 |
*
|
349 | * to do not pe rform the change. | |||
| 338 | * ch ange. | |||||
| 339 | */ | 350 | */ | |||
| 340 |
public voi
d setChang
eSessionId
OnAuthenti
cation(
|
351 | public voi d setChang eSessionId OnAuthenti cation( boolean ch angeSessio nIdOnAuthe ntication) { | |||
| 341 | boolean changeSess ionIdOnAut henticatio n) { | |||||
| 342 | th is.changeS essionIdOn Authentica tion = cha ngeSession IdOnAuthen tication; | 352 | th is.changeS essionIdOn Authentica tion = cha ngeSession IdOnAuthen tication; | |||
| 343 | } | 353 | } | |||
| 344 | 354 | |||||
| 345 | /** | 355 | /** | |||
| 346 | * Ret urn the se cure rando m number g enerator c lass name. | 356 | * Ret urn the se cure rando m number g enerator c lass name. | |||
| 357 | * | |||||
| 358 | * @re turn The f ully quali fied name of the Sec ureRandom implementa tion to | |||||
| 359 | * use | |||||
| 347 | */ | 360 | */ | |||
| 348 | public String ge tSecureRan domClass() { | 361 | public String ge tSecureRan domClass() { | |||
| 349 | 362 |
return
|
||||
| 350 | return ( this.secur eRandomCla ss ) ; | |||||
| 351 | ||||||
| 352 | } | 363 | } | |||
| 353 | 364 | |||||
| 354 | ||||||
| 355 | /** | 365 | /** | |||
| 356 | * Set the secur e random n umber gene rator clas s name. | 366 | * Set the secur e random n umber gene rator clas s name. | |||
| 357 | * | 367 | * | |||
| 358 | * @param s ecureRando mClass The new s ecure rand om number generator class | 368 |
* @param s
ecureRando
mClass
|
|||
| 359 | * name | 369 | * Th e new secu re random number gen erator cla ss name | |||
| 360 | */ | 370 | */ | |||
| 361 | public void setS ecureRando mClass(Str ing secure RandomClas s) { | 371 | public void setS ecureRando mClass(Str ing secure RandomClas s) { | |||
| 362 | th is.secureR andomClass = secureR andomClass ; | 372 | th is.secureR andomClass = secureR andomClass ; | |||
| 363 | } | 373 | } | |||
| 364 | 374 | |||||
| 365 | ||||||
| 366 | /** | 375 | /** | |||
| 367 | * Ret urn the se cure rando m number g enerator a lgorithm n ame. | 376 | * Ret urn the se cure rando m number g enerator a lgorithm n ame. | |||
| 377 | * | |||||
| 378 | * @re turn The n ame of the SecureRan dom algori thm used | |||||
| 368 | */ | 379 | */ | |||
| 369 | public String ge tSecureRan domAlgorit hm() { | 380 | public String ge tSecureRan domAlgorit hm() { | |||
| 370 | re turn secur eRandomAlg orithm; | 381 | re turn secur eRandomAlg orithm; | |||
| 371 | } | 382 | } | |||
| 372 | 383 | |||||
| 373 | ||||||
| 374 | /** | 384 | /** | |||
| 375 | * Set the secur e random n umber gene rator algo rithm name . | 385 | * Set the secur e random n umber gene rator algo rithm name . | |||
| 376 | * | 386 | * | |||
| 377 | * @param s ecureRando mAlgorithm The new s ecure rand om number generator | 387 |
* @param s
ecureRando
mAlgorithm
|
|||
| 378 |
*
|
388 | * The new se cure rando m number g enerator algorithm name | |||
| 379 | */ | 389 | */ | |||
| 380 | public void setS ecureRando mAlgorithm (String se cureRandom Algorithm) { | 390 | public void setS ecureRando mAlgorithm (String se cureRandom Algorithm) { | |||
| 381 | th is.secureR andomAlgor ithm = sec ureRandomA lgorithm; | 391 | th is.secureR andomAlgor ithm = sec ureRandomA lgorithm; | |||
| 382 | } | 392 | } | |||
| 383 | 393 | |||||
| 384 | ||||||
| 385 | /** | 394 | /** | |||
| 386 | * Ret urn the se cure rando m number g enerator p rovider na me. | 395 | * Ret urn the se cure rando m number g enerator p rovider na me. | |||
| 396 | * | |||||
| 397 | * @re turn The n ame of the SecureRan dom provid er | |||||
| 387 | */ | 398 | */ | |||
| 388 | public String ge tSecureRan domProvide r() { | 399 | public String ge tSecureRan domProvide r() { | |||
| 389 | re turn secur eRandomPro vider; | 400 | re turn secur eRandomPro vider; | |||
| 390 | } | 401 | } | |||
| 391 | 402 | |||||
| 392 | ||||||
| 393 | /** | 403 | /** | |||
| 394 | * Set the secur e random n umber gene rator prov ider name. | 404 | * Set the secur e random n umber gene rator prov ider name. | |||
| 395 | * | 405 | * | |||
| 396 | * @param s ecureRando mProvider The new s ecure rand om number generator | 406 |
* @param s
ecureRando
mProvider
|
|||
| 397 |
*
|
407 | * The new se cure rando m number g enerator provider n ame | |||
| 398 | */ | 408 | */ | |||
| 399 | public void setS ecureRando mProvider( String sec ureRandomP rovider) { | 409 | public void setS ecureRando mProvider( String sec ureRandomP rovider) { | |||
| 400 | th is.secureR andomProvi der = secu reRandomPr ovider; | 410 | th is.secureR andomProvi der = secu reRandomPr ovider; | |||
| 401 | } | 411 | } | |||
| 402 | 412 | |||||
| 403 | ||||||
| 404 | ||||||
| 405 | // --- ---------- ---------- ---------- ---------- ---------- ---- Publi c Methods | 413 | // --- ---------- ---------- ---------- ---------- ---------- ---- Publi c Methods | |||
| 406 | 414 | |||||
| 407 | ||||||
| 408 | /** | 415 | /** | |||
| 409 | * Enf orce the s ecurity re strictions in the we b applicat ion deploy ment | 416 | * Enf orce the s ecurity re strictions in the we b applicat ion deploy ment | |||
| 410 | * des criptor of our assoc iated Cont ext. | 417 | * des criptor of our assoc iated Cont ext. | |||
| 411 | * | 418 | * | |||
| 412 | * @param r equest Request t o be proce ssed | 419 |
* @param r
equest
|
|||
| 413 | * @param res ponse Response t o be proce ssed | 420 | * Re quest to b e processe d | |||
| 421 | * @pa ram respon se | |||||
| 422 |
*
|
|||||
| 414 | * | 423 | * | |||
| 415 | * @excepti on IOExcep tion if an inp ut/output error occu rs | 424 |
* @excepti
on IOExcep
tion
|
|||
| 416 | * @exception ServletEx ception if thrown by a proce ssing elem ent | 425 | * if an in put/output error occ urs | |||
| 426 | * @ex ception Se rvletExcep tion | |||||
| 427 |
*
|
|||||
| 417 | */ | 428 | */ | |||
| 418 | @Overr ide | 429 | @Overr ide | |||
| 419 |
public voi
d invoke(R
equest req
uest, Resp
onse respo
nse)
|
430 | public voi d invoke(R equest req uest, Resp onse respo nse) throws IO Exception, ServletEx ception { | |||
| 420 | th rows IOExc eption, Se rvletExcep tion { | |||||
| 421 | 431 | |||||
| 422 | if (log.isDe bugEnabled ()) { | 432 | if (log.isDe bugEnabled ()) { | |||
| 423 |
log.debug(
"Security
checking r
equest " +
|
433 | log.debug( "Security checking r equest " + request.g etMethod() + " " + | |||
| 424 | request.ge t Method() + " " + req uest.get RequestURI ()); | 434 |
request.ge
t
|
|||
| 425 | } | 435 | } | |||
| 426 | 436 | |||||
| 427 | // Have we g ot a cache d authenti cated Prin cipal to r ecord? | 437 | // Have we g ot a cache d authenti cated Prin cipal to r ecord? | |||
| 428 | if (cache) { | 438 | if (cache) { | |||
| 429 | Principa l principa l = reques t.getUserP rincipal() ; | 439 | Principa l principa l = reques t.getUserP rincipal() ; | |||
| 430 | if (prin cipal == n ull) { | 440 | if (prin cipal == n ull) { | |||
| 431 | Sess ion sessio n = reques t.getSessi onInternal (false); | 441 | Sess ion sessio n = reques t.getSessi onInternal (false); | |||
| 432 | if ( session != null) { | 442 | if ( session != null) { | |||
| 433 | principal = session. getPrincip al(); | 443 | principal = session. getPrincip al(); | |||
| 434 | if (princi pal != nul l) { | 444 | if (princi pal != nul l) { | |||
| 435 | if (lo g.isDebugE nabled()) { | 445 | if (lo g.isDebugE nabled()) { | |||
| 436 |
log.debug(
"We have c
ached auth
type " +
|
446 | log.debug( "We have c ached auth type " + session.g etAuthType () + | |||
| 437 | session. getAuthTyp e() + | 447 | " for prin cipal " + principal ); | |||
| 438 |
" for prin
cipal " +
|
|||||
| 439 | session. getPrincip al()); | |||||
| 440 | } | 448 | } | |||
| 441 | reques t.setAuthT ype(sessio n.getAuthT ype()); | 449 | reques t.setAuthT ype(sessio n.getAuthT ype()); | |||
| 442 | reques t.setUserP rincipal(p rincipal); | 450 | reques t.setUserP rincipal(p rincipal); | |||
| 443 | } | 451 | } | |||
| 444 | } | 452 | } | |||
| 445 | } | 453 | } | |||
| 446 | } | 454 | } | |||
| 447 | 455 | |||||
| 448 | // Special h andling fo r form-bas ed logins to deal wi th the cas e | 456 | bo olean auth Required = isContinu ationRequi red(reques t); | |||
| 449 | // where the login for m (and the refore the "j_securi ty_check" URI | |||||
| 450 | // to which it submits ) might be outside t he secured area | |||||
| 451 | St ring conte xtPath = t his.contex t.getPath( ); | |||||
| 452 | St ring decod edRequestU RI = reque st.getDeco dedRequest URI(); | |||||
| 453 | if (decodedR equestURI. startsWith (contextPa th) && | |||||
| 454 | deco dedRequest URI.endsWi th(Constan ts.FORM_AC TION)) { | |||||
| 455 | if (!aut henticate( request, r esponse)) { | |||||
| 456 | if ( log.isDebu gEnabled() ) { | |||||
| 457 | log.debug( " Failed a uthenticat e() test ? ?" + decod edRequestU RI ); | |||||
| 458 | } | |||||
| 459 | retu rn; | |||||
| 460 | } | |||||
| 461 | } | |||||
| 462 | ||||||
| 463 | // Special h andling fo r form-bas ed logins to deal wi th the cas e where | |||||
| 464 | // a resourc e is prote cted for s ome HTTP m ethods but not prote cted for | |||||
| 465 | // GET which is used a fter authe ntication when redir ecting to the | |||||
| 466 | // protected resource. | |||||
| 467 | // TODO: Thi s is simil ar to the FormAuthen ticator.ma tchRequest () logic | |||||
| 468 | // Is there a wa y to remov e the dupl ication? | |||||
| 469 | Se ssion sess ion = requ est.getSes sionIntern al(false); | |||||
| 470 | if (session != null) { | |||||
| 471 | SavedReq uest saved Request = | |||||
| 472 | (SavedRequ est) sessi on.getNote (Constants .FORM_REQU EST_NOTE); | |||||
| 473 | if (save dRequest ! = null && | |||||
| 474 | decodedReq uestURI.eq uals(saved Request.ge tDecodedRe questURI() ) && | |||||
| 475 | !authentic ate(reques t, respons e)) { | |||||
| 476 | if ( log.isDebu gEnabled() ) { | |||||
| 477 | log.debug( " Failed a uthenticat e() test") ; | |||||
| 478 | } | |||||
| 479 | /* | |||||
| 480 | * A SSERT: Aut henticator already s et the app ropriate | |||||
| 481 | * H TTP status code, so we do not have to do anything | |||||
| 482 | * s pecial | |||||
| 483 | */ | |||||
| 484 | retu rn; | |||||
| 485 | } | |||||
| 486 | } | |||||
| 487 | 457 | |||||
| 488 | // The Servl et may spe cify secur ity constr aints thro ugh annota tions. | 458 | // The Servl et may spe cify secur ity constr aints thro ugh annota tions. | |||
| 489 | // Ensure th at they ha ve been pr ocessed be fore const raints are checked | 459 | // Ensure th at they ha ve been pr ocessed be fore const raints are checked | |||
| 490 |
Wrapper wr
apper = re
quest.get
MappingDat
a().w
rapper
|
460 | Wrapper wr apper = re quest.get W rapper () ; | |||
| 491 | if (wrapper != null) { | 461 | if (wrapper != null) { | |||
| 492 | wrapper. servletSec urityAnnot ationScan( ); | 462 | wrapper. servletSec urityAnnot ationScan( ); | |||
| 493 | } | 463 | } | |||
| 494 | 464 | |||||
| 495 | Re alm realm = this.con text.getRe alm(); | 465 | Re alm realm = this.con text.getRe alm(); | |||
| 496 | // Is this r equest URI subject t o a securi ty constra int? | 466 | // Is this r equest URI subject t o a securi ty constra int? | |||
| 497 |
SecurityCo
nstraint
[] constra
ints
|
467 |
SecurityCo
nstraint
|
|||
| 498 | = realm. findSecuri tyConstrai nts(reques t, this.co ntext); | 468 | ||||
| 469 | Au thConfigPr ovider jas picProvide r = getJas picProvide r(); | |||||
| 470 | if (jaspicPr ovider != null) { | |||||
| 471 | authRequ ired = tru e; | |||||
| 472 | } | |||||
| 499 | 473 | |||||
| 500 |
if (constr
aints == n
ull && !co
ntext.getP
reemptiveA
uthenticat
ion()
|
474 | if (constr aints == n ull && !co ntext.getP reemptiveA uthenticat ion() && !authR equired ) { | |||
| 501 | if (log. isDebugEna bled()) { | 475 | if (log. isDebugEna bled()) { | |||
| 502 | log. debug(" No t subject to any con straint"); | 476 | log. debug(" No t subject to any con straint"); | |||
| 503 | } | 477 | } | |||
| 504 | getNext( ).invoke(r equest, re sponse); | 478 | getNext( ).invoke(r equest, re sponse); | |||
| 505 | return; | 479 | return; | |||
| 506 | } | 480 | } | |||
| 507 | 481 | |||||
| 508 | // Make sure that cons trained re sources ar e not cach ed by web proxies | 482 | // Make sure that cons trained re sources ar e not cach ed by web proxies | |||
| 509 | // or browse rs as cach ing can pr ovide a se curity hol e | 483 | // or browse rs as cach ing can pr ovide a se curity hol e | |||
| 510 | if (constrai nts != nul l && disab leProxyCac hing && | 484 | if (constrai nts != nul l && disab leProxyCac hing && | |||
| 511 | !"POST". equalsIgno reCase(req uest.getMe thod())) { | 485 | !"PO ST".equals IgnoreCase (request.g etMethod() )) { | |||
| 512 | if (secu rePagesWit hPragma) { | 486 | if (secu rePagesWit hPragma) { | |||
| 513 | // N ote: These can cause problems with downl oading fil es with IE | 487 | // N ote: These can cause problems with downl oading fil es with IE | |||
| 514 | resp onse.setHe ader("Prag ma", "No-c ache"); | 488 | resp onse.setHe ader("Prag ma", "No-c ache"); | |||
| 515 | resp onse.setHe ader("Cach e-Control" , "no-cach e"); | 489 | resp onse.setHe ader("Cach e-Control" , "no-cach e"); | |||
| 516 | } else { | 490 | } else { | |||
| 517 | resp onse.setHe ader("Cach e-Control" , "private "); | 491 | resp onse.setHe ader("Cach e-Control" , "private "); | |||
| 518 | } | 492 | } | |||
| 519 | response .setHeader ("Expires" , DATE_ONE ); | 493 | response .setHeader ("Expires" , DATE_ONE ); | |||
| 520 | } | 494 | } | |||
| 521 | 495 | |||||
| 522 | in t i; | |||||
| 523 | if (constrai nts != nul l) { | 496 | if (constrai nts != nul l) { | |||
| 524 | // Enfor ce any use r data con straint fo r this sec urity cons traint | 497 | // Enfor ce any use r data con straint fo r this sec urity cons traint | |||
| 525 | if (log. isDebugEna bled()) { | 498 | if (log. isDebugEna bled()) { | |||
| 526 | log. debug(" Ca lling hasU serDataPer mission()" ); | 499 | log. debug(" Ca lling hasU serDataPer mission()" ); | |||
| 527 | } | 500 | } | |||
| 528 |
if (!realm
.hasUserDa
taPermissi
on(request
, response
,
|
501 | if (!realm .hasUserDa taPermissi on(request , response , constrain ts)) { | |||
| 529 | const raints)) { | |||||
| 530 | if ( log.isDebu gEnabled() ) { | 502 | if ( log.isDebu gEnabled() ) { | |||
| 531 | log.debug( " Failed h asUserData Permission () test"); | 503 | log.debug( " Failed h asUserData Permission () test"); | |||
| 532 | } | 504 | } | |||
| 533 | /* | 505 | /* | |||
| 534 |
* ASSERT:
Authentica
tor alread
y set the
appropriat
e
|
506 | * ASSERT: Authentica tor alread y set the appropriat e HTTP stat us | |||
| 535 | * HTTP statu s code, so w e do not h ave to do anything s pecial | 507 |
*
|
|||
| 536 | */ | 508 | */ | |||
| 537 | retu rn; | 509 | retu rn; | |||
| 538 | } | 510 | } | |||
| 539 | } | 511 | } | |||
| 540 | 512 | |||||
| 541 | // Since aut henticate modifies t he respons e on failu re, | 513 | // Since aut henticate modifies t he respons e on failu re, | |||
| 542 | // we have t o check fo r allow-fr om-all fir st. | 514 | // we have t o check fo r allow-fr om-all fir st. | |||
| 543 |
boolean
|
515 |
boolean
h
a
sA
uth
Const
r
aint = fal
s
e
|
|||
| 544 | if (constr aints = = null) { | 516 | if (constr aints ! = null) { | |||
| 545 | authRequ ired = fal se; | 517 | h a sA uth Const r aint = true; | |||
| 546 | } else { | 518 | for (i nt i = 0; i < con straints.l ength && h a sA uth Const r aint ; i++) { | |||
| 547 |
|
519 | if (!constrai nts[i].get AuthConstr aint()) { | |||
| 548 |
for
|
520 | h a sA uth Const r aint = false; | |||
| 549 |
if
|
521 | } else if (!constrai nts[i].get AllRoles() && | |||
| 550 |
|
|||||
| 551 | break; | |||||
| 552 |
} else if
|
|||||
| 553 | !const raints[i]. getAuthent icatedUser s()) { | 522 | !const raints[i]. getAuthent icatedUser s()) { | |||
| 554 | String [] roles = constrain ts[i].find AuthRoles( ); | 523 |
String
|
|||
| 555 |
if
|
524 | if (roles == null || ro les.length == 0) { | |||
| 556 |
|
525 | h a sA uth Const r aint = false; | |||
| 557 | break; | 526 | } | |||
| 558 | } | 527 | } | |||
| 559 | } | 528 | } | |||
| 560 | } | 529 | } | |||
| 530 | ||||||
| 531 | if (!authReq uired && h asAuthCons traint) { | |||||
| 532 | authRequ ired = tru e; | |||||
| 561 | } | 533 | } | |||
| 562 | 534 | |||||
| 563 | if (!authReq uired && c ontext.get Preemptive Authentica tion()) { | 535 | if (!authReq uired && c ontext.get Preemptive Authentica tion()) { | |||
| 564 | authRequ ired = | 536 | authRequ ired = | |||
| 565 |
request.ge
tCoyoteReq
uest().get
MimeHeader
s().getVal
ue(
|
537 | request.ge tCoyoteReq uest().get MimeHeader s().getVal ue( "authoriza tion") != null; | |||
| 566 | "autho rization") != null; | |||||
| 567 | } | 538 | } | |||
| 568 | 539 | |||||
| 569 | if (!authR equired && context.g etPreempti veAuthenti cation() && | 540 |
if (!authR
equired &&
context.g
etPreempti
veAuthenti
cation()
|
|||
| 570 |
|
541 | && HttpServle tRequest.C LIENT_CERT _AUTH.equa ls(getAuth Method())) { | |||
| 571 | X509Cert ificate[] certs = ge tRequestCe rtificates (request); | 542 | X509Cert ificate[] certs = ge tRequestCe rtificates (request); | |||
| 572 | authRequ ired = cer ts != null && certs. length > 0 ; | 543 | authRequ ired = cer ts != null && certs. length > 0 ; | |||
| 573 | } | 544 | } | |||
| 574 | 545 | |||||
| 575 |
if
|
546 | Ja spicState jaspicStat e = null; | |||
| 547 | ||||||
| 548 | if (authRequi red) { | |||||
| 576 | if (log. isDebugEna bled()) { | 549 | if (log. isDebugEna bled()) { | |||
| 577 | log. debug(" Ca lling auth enticate() "); | 550 | log. debug(" Ca lling auth enticate() "); | |||
| 578 | } | 551 | } | |||
| 579 |
if (
!authentic
ate
|
552 | ||||
| 553 | if (jasp icProvider != null) { | |||||
| 554 | jasp icState = getJaspicS tate(jaspi cProvider, request, response, hasAuthCon straint); | |||||
| 555 | if ( jaspicStat e == null) { | |||||
| 556 | return; | |||||
| 557 | } | |||||
| 558 | } | |||||
| 559 | ||||||
| 560 | if (jasp icProvider == null & & !doAuthe nticate(re quest, res ponse) || | |||||
| 561 | jaspicProv ider != nu ll && | |||||
| 562 |
|
|||||
| 580 | if ( log.isDebu gEnabled() ) { | 563 | if ( log.isDebu gEnabled() ) { | |||
| 581 | log.debug( " Failed a uthenticat e() test") ; | 564 | log.debug( " Failed a uthenticat e() test") ; | |||
| 582 | } | 565 | } | |||
| 583 | /* | 566 | /* | |||
| 584 |
* ASSERT:
Authentica
tor alread
y set the
appropriat
e
|
567 | * ASSERT: Authentica tor alread y set the appropriat e HTTP stat us | |||
| 585 |
*
HTTP statu
s
code, so w
e do not h
ave to do
anything
|
568 |
*
|
|||
| 586 | * s pecial | |||||
| 587 | */ | 569 | */ | |||
| 588 | retu rn; | 570 | retu rn; | |||
| 589 | } | 571 | } | |||
| 590 | 572 | |||||
| 591 | } | 573 | } | |||
| 592 | 574 | |||||
| 593 | if (constrai nts != nul l) { | 575 | if (constrai nts != nul l) { | |||
| 594 | if (log. isDebugEna bled()) { | 576 | if (log. isDebugEna bled()) { | |||
| 595 | log. debug(" Ca lling acce ssControl( )"); | 577 | log. debug(" Ca lling acce ssControl( )"); | |||
| 596 | } | 578 | } | |||
| 597 |
if (!realm
.hasResour
cePermissi
on(request
, response
,
|
579 | if (!realm .hasResour cePermissi on(request , response , constrain ts, this.c ontext)) { | |||
| 598 | const raints, | |||||
| 599 | this. context)) { | |||||
| 600 | if ( log.isDebu gEnabled() ) { | 580 | if ( log.isDebu gEnabled() ) { | |||
| 601 | log.debug( " Failed a ccessContr ol() test" ); | 581 | log.debug( " Failed a ccessContr ol() test" ); | |||
| 602 | } | 582 | } | |||
| 603 | /* | 583 | /* | |||
| 604 |
* ASSERT:
AccessCont
rol method
has alrea
dy set the
|
584 | * ASSERT: AccessCont rol method has alrea dy set the appropria te | |||
| 605 |
*
appropriat
e
HTTP statu
s code, so
we do not
have to d
o
|
585 |
*
|
|||
| 606 | * a nything sp ecial | |||||
| 607 | */ | 586 | */ | |||
| 608 | retu rn; | 587 | retu rn; | |||
| 609 | } | 588 | } | |||
| 610 | } | 589 | } | |||
| 611 | 590 | |||||
| 612 | // Any and a ll specifi ed constra ints have been satis fied | 591 | // Any and a ll specifi ed constra ints have been satis fied | |||
| 613 | if (log.isDe bugEnabled ()) { | 592 | if (log.isDe bugEnabled ()) { | |||
| 614 | log.debu g(" Succes sfully pas sed all se curity con straints") ; | 593 | log.debu g(" Succes sfully pas sed all se curity con straints") ; | |||
| 615 | } | 594 | } | |||
| 616 | ge tNext().in voke(reque st, respon se); | 595 | ge tNext().in voke(reque st, respon se); | |||
| 617 | 596 | |||||
| 597 | if (jaspicPr ovider != null) { | |||||
| 598 | secureRe sponseJspi c(request, response, jaspicSta te); | |||||
| 599 | } | |||||
| 600 | } | |||||
| 601 | ||||||
| 602 | ||||||
| 603 | @Overr ide | |||||
| 604 | public boolean a uthenticat e(Request request, H ttpServlet Response h ttpRespons e) | |||||
| 605 | throws I OException { | |||||
| 606 | ||||||
| 607 | Au thConfigPr ovider jas picProvide r = getJas picProvide r(); | |||||
| 608 | ||||||
| 609 | if (jaspicPr ovider == null) { | |||||
| 610 | return d oAuthentic ate(reques t, httpRes ponse); | |||||
| 611 | } else { | |||||
| 612 | Response response = request. getRespons e(); | |||||
| 613 | JaspicSt ate jaspic State = ge tJaspicSta te(jaspicP rovider, r equest, re sponse, tr ue); | |||||
| 614 | if (jasp icState == null) { | |||||
| 615 | retu rn false; | |||||
| 616 | } | |||||
| 617 | ||||||
| 618 | boolean result = a uthenticat eJaspic(re quest, res ponse, jas picState, true); | |||||
| 619 | ||||||
| 620 | secureRe sponseJspi c(request, response, jaspicSta te); | |||||
| 621 | ||||||
| 622 | return r esult; | |||||
| 623 | } | |||||
| 624 | } | |||||
| 625 | ||||||
| 626 | ||||||
| 627 | privat e void sec ureRespons eJspic(Req uest reque st, Respon se respons e, JaspicS tate state ) { | |||||
| 628 | tr y { | |||||
| 629 | state.se rverAuthCo ntext.secu reResponse (state.mes sageInfo, null); | |||||
| 630 | request. setRequest ((HttpServ letRequest ) state.me ssageInfo. getRequest Message()) ; | |||||
| 631 | response .setRespon se((HttpSe rvletRespo nse) state .messageIn fo.getResp onseMessag e()); | |||||
| 632 | } catch (Aut hException e) { | |||||
| 633 | log.warn (sm.getStr ing("authe nticator.j aspicSecur eResponseF ail"), e); | |||||
| 634 | } | |||||
| 635 | } | |||||
| 636 | ||||||
| 637 | ||||||
| 638 | privat e JaspicSt ate getJas picState(A uthConfigP rovider ja spicProvid er, Reques t request, | |||||
| 639 | Response response, boolean a uthMandato ry) throws IOExcepti on { | |||||
| 640 | Ja spicState jaspicStat e = new Ja spicState( ); | |||||
| 641 | ||||||
| 642 | ja spicState. messageInf o = | |||||
| 643 | new MessageInf oImpl(requ est.getReq uest(), re sponse.get Response() , authMand atory); | |||||
| 644 | ||||||
| 645 | tr y { | |||||
| 646 | ServerAu thConfig s erverAuthC onfig = ja spicProvid er.getServ erAuthConf ig( | |||||
| 647 | "HttpServl et", jaspi cAppContex tID, Callb ackHandler Impl.getIn stance()); | |||||
| 648 | String a uthContext ID = serve rAuthConfi g.getAuthC ontextID(j aspicState .messageIn fo); | |||||
| 649 | jaspicSt ate.server AuthContex t = server AuthConfig .getAuthCo ntext(auth ContextID, null, nul l); | |||||
| 650 | } catch (Aut hException e) { | |||||
| 651 | log.warn (sm.getStr ing("authe nticator.j aspicServe rAuthConte xtFail"), e); | |||||
| 652 | response .sendError (HttpServl etResponse .SC_INTERN AL_SERVER_ ERROR); | |||||
| 653 | return n ull; | |||||
| 654 | } | |||||
| 655 | ||||||
| 656 | re turn jaspi cState; | |||||
| 618 | } | 657 | } | |||
| 619 | 658 | |||||
| 620 | 659 | |||||
| 621 | // --- ---------- ---------- ---------- ---------- ---------- - Protecte d Methods | 660 | // --- ---------- ---------- ---------- ---------- ---------- - Protecte d Methods | |||
| 622 | 661 | |||||
| 623 | /** | 662 | /** | |||
| 663 | * Pro vided for sub-classe s to imple ment their specific authentica tion | |||||
| 664 | * mec hanism. | |||||
| 665 | * | |||||
| 666 | * @pa ram reques t The requ est that t riggered t he authent ication | |||||
| 667 | * @pa ram respon se The res ponse asso ciated wit h the requ est | |||||
| 668 | * | |||||
| 669 | * @re turn {@cod e true} if the the u ser was au thenticate d, otherwi se {@code | |||||
| 670 | * false }, in whic h case an authentica tion chall enge will have been | |||||
| 671 | * writt en to the response | |||||
| 672 | * | |||||
| 673 | * @th rows IOExc eption If an I/O pro blem occur red during the authe ntication | |||||
| 674 | * pro cess | |||||
| 675 | */ | |||||
| 676 | protec ted abstra ct boolean doAuthent icate(Requ est reques t, HttpSer vletRespon se respons e) | |||||
| 677 | throws I OException ; | |||||
| 678 | ||||||
| 679 | ||||||
| 680 | /** | |||||
| 681 | * Doe s this aut henticator require t hat {@link #authenti cate(Reque st, | |||||
| 682 | * Htt pServletRe sponse)} i s called t o continue an authen tication p rocess | |||||
| 683 | * tha t started in a previ ous reques t? | |||||
| 684 | * | |||||
| 685 | * @pa ram reques t The requ est curren tly being processed | |||||
| 686 | * | |||||
| 687 | * @re turn {@cod e true} if authentic ate() must be called , otherwis e | |||||
| 688 | * {@cod e false} | |||||
| 689 | */ | |||||
| 690 | protec ted boolea n isContin uationRequ ired(Reque st request ) { | |||||
| 691 | re turn false ; | |||||
| 692 | } | |||||
| 693 | ||||||
| 694 | ||||||
| 695 | /** | |||||
| 624 | * Loo k for the X509 certi ficate cha in in the Request un der the ke y | 696 | * Loo k for the X509 certi ficate cha in in the Request un der the ke y | |||
| 625 | * <co de>javax.s ervlet.req uest.X509C ertificate </code>. I f not foun d, trigger | 697 | * <co de>javax.s ervlet.req uest.X509C ertificate </code>. I f not foun d, trigger | |||
| 626 | * ext racting th e certific ate chain from the C oyote requ est. | 698 | * ext racting th e certific ate chain from the C oyote requ est. | |||
| 627 | * | 699 | * | |||
| 628 | * @param r equest Request to be proces sed | 700 |
* @param r
equest
|
|||
| 701 | * Re quest to b e processe d | |||||
| 629 | * | 702 | * | |||
| 630 |
* @return
The X509 c
ertificate
chain if
found, <co
de>null</c
ode>
|
703 | * @return The X509 c ertificate chain if found, <co de>null</c ode> otherwise . | |||
| 631 | * otherw ise. | |||||
| 632 | */ | 704 | */ | |||
| 633 | protec ted X509Ce rtificate[ ] getReque stCertific ates(final Request r equest) | 705 | protec ted X509Ce rtificate[ ] getReque stCertific ates(final Request r equest) | |||
| 634 | throws I llegalStat eException { | 706 | throws I llegalStat eException { | |||
| 635 | 707 | |||||
| 636 | X5 09Certific ate certs[ ] = | 708 | X5 09Certific ate certs[ ] = | |||
| 637 | (X50 9Certifica te[]) requ est.getAtt ribute(Glo bals.CERTI FICATES_AT TR); | 709 | (X50 9Certifica te[]) requ est.getAtt ribute(Glo bals.CERTI FICATES_AT TR); | |||
| 638 | 710 | |||||
| 639 | if ((certs = = null) || (certs.le ngth < 1)) { | 711 | if ((certs = = null) || (certs.le ngth < 1)) { | |||
| 640 | try { | 712 | try { | |||
| 641 | requ est.getCoy oteRequest ().action( ActionCode .REQ_SSL_C ERTIFICATE , null); | 713 | requ est.getCoy oteRequest ().action( ActionCode .REQ_SSL_C ERTIFICATE , null); | |||
| 642 | cert s = (X509C ertificate []) reques t.getAttri bute(Globa ls.CERTIFI CATES_ATTR ); | 714 | cert s = (X509C ertificate []) reques t.getAttri bute(Globa ls.CERTIFI CATES_ATTR ); | |||
| 643 | } catch (IllegalSt ateExcepti on ise) { | 715 | } catch (IllegalSt ateExcepti on ise) { | |||
| 644 | // R equest bod y was too large for save buffe r | 716 | // R equest bod y was too large for save buffe r | |||
| 645 | // R eturn null which wil l trigger an auth fa ilure | 717 | // R eturn null which wil l trigger an auth fa ilure | |||
| 646 | } | 718 | } | |||
| 647 | } | 719 | } | |||
| 648 | 720 | |||||
| 649 | re turn certs ; | 721 | re turn certs ; | |||
| 650 | } | 722 | } | |||
| 651 | 723 | |||||
| 652 | ||||||
| 653 | /** | 724 | /** | |||
| 654 |
* Associat
e the spec
ified sing
le sign on
identifie
r with the
|
725 | * Associat e the spec ified sing le sign on identifie r with the specified | |||
| 655 | * specified Session. | 726 |
*
|
|||
| 656 | * | 727 | * | |||
| 657 | * @param s soId Single si gn on iden tifier | 728 |
* @param s
soId
|
|||
| 658 | * @param ses sion Session to be associ ated | 729 | * Si ngle sign on identif ier | |||
| 730 | * @pa ram sessio n | |||||
| 731 |
*
|
|||||
| 659 | */ | 732 | */ | |||
| 660 | protec ted void a ssociate(S tring ssoI d, Session session) { | 733 | protec ted void a ssociate(S tring ssoI d, Session session) { | |||
| 661 | 734 | |||||
| 662 | if (sso == n ull) { | 735 | if (sso == n ull) { | |||
| 663 | return; | 736 | return; | |||
| 664 | } | 737 | } | |||
| 665 | ss o.associat e(ssoId, s ession); | 738 | ss o.associat e(ssoId, s ession); | |||
| 666 | 739 | |||||
| 667 | } | 740 | } | |||
| 668 | 741 | |||||
| 669 | 742 | |||||
| 670 | /** | 743 | privat e boolean authentica teJaspic(R equest req uest, Resp onse respo nse, Jaspi cState sta te, | |||
| 671 | * Aut henticate the user m aking this request, based on t he login | 744 | boolean requirePri ncipal) { | |||
| 672 | * con figuration of the {@ link Conte xt} with w hich this Authentica tor is | 745 | ||||
| 673 | * ass ociated. Return <co de>true</c ode> if an y specifie d constrai nt has | 746 | bo olean cach edAuth = c heckForCac hedAuthent ication(re quest, res ponse, fal se); | |||
| 674 | * bee n satisfie d, or <cod e>false</c ode> if we have crea ted a resp onse | 747 | Su bject clie nt = new S ubject(); | |||
| 675 | * cha llenge alr eady. | 748 | Au thStatus a uthStatus; | |||
| 676 | * | 749 | tr y { | |||
| 677 | * @pa ram reques t Request we are pro cessing | 750 | authStat us = state .serverAut hContext.v alidateReq uest(state .messageIn fo, client , null); | |||
| 678 | * @pa ram respon se Respons e we are p opulating | 751 | } catch (Aut hException e) { | |||
| 679 | * | 752 | log.debu g(sm.getSt ring("auth enticator. loginFail" ), e); | |||
| 680 | * @ex ception IO Exception if an inpu t/output e rror occur s | 753 | return f alse; | |||
| 681 | */ | 754 | } | |||
| 682 | @Overr ide | 755 | ||||
| 683 | public abstract boolean au thenticate (Request r equest, | 756 | re quest.setR equest((Ht tpServletR equest) st ate.messag eInfo.getR equestMess age()); | |||
| 684 | HttpServ letRespons e response ) throws I OException ; | 757 | re sponse.set Response(( HttpServle tResponse) state.mes sageInfo.g etResponse Message()) ; | |||
| 758 | ||||||
| 759 | if (authStat us == Auth Status.SUC CESS) { | |||||
| 760 | GenericP rincipal p rincipal = getPrinci pal(client ); | |||||
| 761 | if (log. isDebugEna bled()) { | |||||
| 762 | log. debug("Aut henticated user: " + principal ); | |||||
| 763 | } | |||||
| 764 | if (prin cipal == n ull) { | |||||
| 765 | requ est.setUse rPrincipal (null); | |||||
| 766 | requ est.setAut hType(null ); | |||||
| 767 | if ( requirePri ncipal) { | |||||
| 768 | return fal se; | |||||
| 769 | } | |||||
| 770 | } else i f (cachedA uth == fal se || | |||||
| 771 | !principal .getUserPr incipal(). equals(req uest.getUs erPrincipa l())) { | |||||
| 772 | // S kip regist ration if authentica tion crede ntials wer e | |||||
| 773 | // c ached and the Princi pal did no t change. | |||||
| 774 | requ est.setNot e(Constant s.REQ_JASP IC_SUBJECT _NOTE, cli ent); | |||||
| 775 | @Sup pressWarni ngs("rawty pes")// JA SPIC API u ses raw ty pes | |||||
| 776 | Map map = stat e.messageI nfo.getMap (); | |||||
| 777 | if ( map != nul l && map.c ontainsKey ("javax.se rvlet.http .registerS ession")) { | |||||
| 778 | register(r equest, re sponse, pr incipal, " JASPIC", n ull, null, true, tru e); | |||||
| 779 | } el se { | |||||
| 780 | register(r equest, re sponse, pr incipal, " JASPIC", n ull, null) ; | |||||
| 781 | } | |||||
| 782 | } | |||||
| 783 | return t rue; | |||||
| 784 | } | |||||
| 785 | re turn false ; | |||||
| 786 | } | |||||
| 787 | ||||||
| 788 | ||||||
| 789 | privat e GenericP rincipal g etPrincipa l(Subject subject) { | |||||
| 790 | if (subject == null) { | |||||
| 791 | return n ull; | |||||
| 792 | } | |||||
| 793 | ||||||
| 794 | Se t<GenericP rincipal> principals = subject .getPrivat eCredentia ls(Generic Principal. class); | |||||
| 795 | if (principa ls.isEmpty ()) { | |||||
| 796 | return n ull; | |||||
| 797 | } | |||||
| 798 | ||||||
| 799 | re turn princ ipals.iter ator().nex t(); | |||||
| 800 | } | |||||
| 685 | 801 | |||||
| 686 | 802 | |||||
| 687 | /** | 803 | /** | |||
| 688 | * Che ck to see if the use r has alre ady been a uthenticat ed earlier in the | 804 | * Che ck to see if the use r has alre ady been a uthenticat ed earlier in the | |||
| 689 | * pro cessing ch ain or if there is e nough info rmation av ailable to | 805 | * pro cessing ch ain or if there is e nough info rmation av ailable to | |||
| 690 | * aut henticate the user w ithout req uiring fur ther user interactio n. | 806 | * aut henticate the user w ithout req uiring fur ther user interactio n. | |||
| 691 | * | 807 | * | |||
| 692 | * @param r equest The curre nt request | 808 |
* @param r
equest
|
|||
| 693 |
*
@param res
ponse
The curren
t re
spons
e
|
809 |
*
|
|||
| 694 |
*
@param use
SSO
Should inf
ormation a
vailable f
rom SSO be
used to a
ttempt
|
810 | * @pa ram respon se | |||
| 695 | * to authentica te the cur rent user? | 811 | * Th e current response | |||
| 812 | * @pa ram useSSO | |||||
| 813 |
*
|
|||||
| 814 |
*
|
|||||
| 696 | * | 815 | * | |||
| 697 | * @re turn <code >true</cod e> if the user was a uthenticat ed via the cache, | 816 | * @re turn <code >true</cod e> if the user was a uthenticat ed via the cache, | |||
| 698 | * other wise <code >false</co de> | 817 | * other wise <code >false</co de> | |||
| 699 | */ | 818 | */ | |||
| 700 |
protected
boolean ch
eckForCach
edAuthenti
cation(Req
uest reque
st,
|
819 | protected boolean ch eckForCach edAuthenti cation(Req uest reque st, HttpServl etResponse response, boolean u seSSO) { | |||
| 701 | HttpServ letRespons e response , boolean useSSO) { | |||||
| 702 | 820 | |||||
| 703 | // Has the u ser alread y been aut henticated ? | 821 | // Has the u ser alread y been aut henticated ? | |||
| 704 | Pr incipal pr incipal = request.ge tUserPrinc ipal(); | 822 | Pr incipal pr incipal = request.ge tUserPrinc ipal(); | |||
| 705 | St ring ssoId = (String ) request. getNote(Co nstants.RE Q_SSOID_NO TE); | 823 | St ring ssoId = (String ) request. getNote(Co nstants.RE Q_SSOID_NO TE); | |||
| 706 | if (principa l != null) { | 824 | if (principa l != null) { | |||
| 707 | if (log. isDebugEna bled()) { | 825 | if (log. isDebugEna bled()) { | |||
| 708 | log. debug(sm.g etString(" authentica tor.check. found", pr incipal.ge tName())); | 826 | log. debug(sm.g etString(" authentica tor.check. found", pr incipal.ge tName())); | |||
| 709 | } | 827 | } | |||
| 710 | // Assoc iate the s ession wit h any exis ting SSO s ession. Ev en if | 828 | // Assoc iate the s ession wit h any exis ting SSO s ession. Ev en if | |||
| 711 | // useSS O is false , this wil l ensure c oordinated session | 829 | // useSS O is false , this wil l ensure c oordinated session | |||
| 712 | // inval idation at log out. | 830 | // inval idation at log out. | |||
| 713 | if (ssoI d != null) { | 831 | if (ssoI d != null) { | |||
| 714 | asso ciate(ssoI d, request .getSessio nInternal( true)); | 832 | asso ciate(ssoI d, request .getSessio nInternal( true)); | |||
| 715 | } | 833 | } | |||
| 716 | return t rue; | 834 | return t rue; | |||
| 717 | } | 835 | } | |||
| 718 | 836 | |||||
| 719 | // Is there an SSO ses sion again st which w e can try to reauthe nticate? | 837 | // Is there an SSO ses sion again st which w e can try to reauthe nticate? | |||
| 720 | if (useSSO & & ssoId != null) { | 838 | if (useSSO & & ssoId != null) { | |||
| 721 | if (log. isDebugEna bled()) { | 839 | if (log. isDebugEna bled()) { | |||
| 722 | log. debug(sm.g etString(" authentica tor.check. sso", ssoI d)); | 840 | log. debug(sm.g etString(" authentica tor.check. sso", ssoI d)); | |||
| 723 | } | 841 | } | |||
| 724 | / * Try to r eauthentic ate using data cache d by SSO. If this fa ils, | 842 | /* | |||
| 725 |
|
843 |
|
|||
| 726 |
we
can't rea
uthenticat
e ourselve
s because
there is n
o
|
844 | * either the original SSO logon was of DIG EST or SSL (which we | |||
| 727 |
cached
username
and passwo
rd), or th
e realm de
nied
|
845 | * can't rea uthenticat e ourselve s because there is n o cached | |||
| 728 |
the user's
reauthent
ication fo
r some rea
son.
|
846 | * username and passwo rd), or th e realm de nied the user' s | |||
| 729 | In either case we ha ve to prompt th e user for a logon */ | 847 | * reauthent ication fo r some rea son. In either case we h ave to | |||
| 848 |
*
prompt th
e user for
a logon
|
|||||
| 849 | */ | |||||
| 730 | if (reau thenticate FromSSO(ss oId, reque st)) { | 850 | if (reau thenticate FromSSO(ss oId, reque st)) { | |||
| 731 | retu rn true; | 851 | retu rn true; | |||
| 732 | } | 852 | } | |||
| 733 | } | 853 | } | |||
| 734 | 854 | |||||
| 735 | // Has the C onnector p rovided a pre-authen ticated Pr incipal th at now | 855 | // Has the C onnector p rovided a pre-authen ticated Pr incipal th at now | |||
| 736 | // needs to be authori zed? | 856 | // needs to be authori zed? | |||
| 737 | if (request. getCoyoteR equest().g etRemoteUs erNeedsAut horization ()) { | 857 | if (request. getCoyoteR equest().g etRemoteUs erNeedsAut horization ()) { | |||
| 738 | String u sername = request.ge tCoyoteReq uest().get RemoteUser ().toStrin g(); | 858 | String u sername = request.ge tCoyoteReq uest().get RemoteUser ().toStrin g(); | |||
| 739 | if (user name != nu ll) { | 859 | if (user name != nu ll) { | |||
| 740 | if ( log.isDebu gEnabled() ) { | 860 | if ( log.isDebu gEnabled() ) { | |||
| 741 | log.debug( sm.getStri ng("authen ticator.ch eck.author ize", user name)); | 861 | log.debug( sm.getStri ng("authen ticator.ch eck.author ize", user name)); | |||
| 742 | } | 862 | } | |||
| 743 | Prin cipal auth orized = c ontext.get Realm().au thenticate (username) ; | 863 | Prin cipal auth orized = c ontext.get Realm().au thenticate (username) ; | |||
| 744 | if ( authorized == null) { | 864 | if ( authorized == null) { | |||
| 745 | // Realm d oesn't rec ognise use r. Create a user wit h no roles | 865 | // Realm d oesn't rec ognise use r. Create a user wit h no roles | |||
| 746 | // from th e authenti cated user name | 866 | // from th e authenti cated user name | |||
| 747 | if (log.is DebugEnabl ed()) { | 867 | if (log.is DebugEnabl ed()) { | |||
| 748 | log.de bug(sm.get String("au thenticato r.check.au thorizeFai l", userna me)); | 868 | log.de bug(sm.get String("au thenticato r.check.au thorizeFai l", userna me)); | |||
| 749 | } | 869 | } | |||
| 750 | authorized = new Gen ericPrinci pal(userna me, null, null); | 870 | authorized = new Gen ericPrinci pal(userna me, null, null); | |||
| 751 | } | 871 | } | |||
| 752 | Stri ng authTyp e = reques t.getAuthT ype(); | 872 | Stri ng authTyp e = reques t.getAuthT ype(); | |||
| 753 | if ( authType = = null || authType.l ength() == 0) { | 873 | if ( authType = = null || authType.l ength() == 0) { | |||
| 754 | authType = getAuthMe thod(); | 874 | authType = getAuthMe thod(); | |||
| 755 | } | 875 | } | |||
| 756 | regi ster(reque st, respon se, author ized, auth Type, user name, null ); | 876 | regi ster(reque st, respon se, author ized, auth Type, user name, null ); | |||
| 757 | retu rn true; | 877 | retu rn true; | |||
| 758 | } | 878 | } | |||
| 759 | } | 879 | } | |||
| 760 | re turn false ; | 880 | re turn false ; | |||
| 761 | } | 881 | } | |||
| 762 | 882 | |||||
| 763 | ||||||
| 764 | /** | 883 | /** | |||
| 765 |
* Attempts
reauthent
ication to
the <code
>Realm</co
de> using
|
884 | * Attempts reauthent ication to the <code >Realm</co de> using the crede ntials | |||
| 766 | * the creden tials included i n argument <code>ent ry</code>. | 885 |
*
|
|||
| 767 | * | 886 | * | |||
| 768 |
*
@param sso
Id
identifier
of Single
SignOn ses
sion with
which the
|
887 | * @pa ram ssoId | |||
| 769 | * caller is associated | 888 |
*
|
|||
| 770 | * @param req uest the reques t that nee ds to be a uthenticat ed | 889 |
*
|
|||
| 890 | * @pa ram reques t | |||||
| 891 |
*
|
|||||
| 892 | * @re turn <code >true</cod e> if the reauthenti cation fro m SSL occu rred | |||||
| 771 | */ | 893 | */ | |||
| 772 | protec ted boolea n reauthen ticateFrom SSO(String ssoId, Re quest requ est) { | 894 | protec ted boolea n reauthen ticateFrom SSO(String ssoId, Re quest requ est) { | |||
| 773 | 895 | |||||
| 774 | if (sso == n ull || sso Id == null ) { | 896 | if (sso == n ull || sso Id == null ) { | |||
| 775 | return f alse; | 897 | return f alse; | |||
| 776 | } | 898 | } | |||
| 777 | 899 | |||||
| 778 | bo olean reau thenticate d = false; | 900 | bo olean reau thenticate d = false; | |||
| 779 | 901 | |||||
| 780 | Co ntainer pa rent = get Container( ); | 902 | Co ntainer pa rent = get Container( ); | |||
| 781 | if (parent ! = null) { | 903 | if (parent ! = null) { | |||
| 782 | Realm re alm = pare nt.getReal m(); | 904 | Realm re alm = pare nt.getReal m(); | |||
| 783 | if (real m != null) { | 905 | if (real m != null) { | |||
| 784 | reau thenticate d = sso.re authentica te(ssoId, realm, req uest); | 906 | reau thenticate d = sso.re authentica te(ssoId, realm, req uest); | |||
| 785 | } | 907 | } | |||
| 786 | } | 908 | } | |||
| 787 | 909 | |||||
| 788 | if (reauthen ticated) { | 910 | if (reauthen ticated) { | |||
| 789 | associat e(ssoId, r equest.get SessionInt ernal(true )); | 911 | associat e(ssoId, r equest.get SessionInt ernal(true )); | |||
| 790 | 912 | |||||
| 791 | if (log. isDebugEna bled()) { | 913 | if (log. isDebugEna bled()) { | |||
| 792 | log. debug(" Re authentica ted cached principal '" + | 914 | log. debug(" Re authentica ted cached principal '" + | |||
| 793 | requ est.getUse rPrincipal ().getName () + | 915 | reques t.getUserP rincipal() .getName() + | |||
| 794 | "' w ith auth t ype '" + request.ge tAuthType( ) + "'"); | 916 | "' wit h auth typ e '" + req uest.getAu thType() + "'"); | |||
| 795 | } | 917 | } | |||
| 796 | } | 918 | } | |||
| 797 | 919 | |||||
| 798 | re turn reaut henticated ; | 920 | re turn reaut henticated ; | |||
| 799 | } | 921 | } | |||
| 800 | 922 | |||||
| 801 | ||||||
| 802 | /** | 923 | /** | |||
| 803 | * Reg ister an a uthenticat ed Princip al and aut henticatio n type in our | 924 | * Reg ister an a uthenticat ed Princip al and aut henticatio n type in our | |||
| 804 | * req uest, in t he current session ( if there i s one), an d with our | 925 | * req uest, in t he current session ( if there i s one), an d with our | |||
| 805 |
* SingleSi
gnOn valve
, if there
is one.
Set the ap
propriate
cookie
|
926 | * SingleSi gnOn valve , if there is one. S et the app ropriate c ookie to be | |||
| 806 | * to be returned. | 927 |
*
|
|||
| 807 | * | 928 | * | |||
| 808 | * @param req uest The servle t request we are pro cessing | 929 | * @pa ram reques t | |||
| 809 | * @param res ponse The servle t response we are ge nerating | 930 |
*
|
|||
| 810 | * @param pri ncipal The authen ticated Pr incipal to be regist ered | 931 | * @pa ram respon se | |||
| 811 | * @param aut hType The authen tication t ype to be registered | 932 |
*
|
|||
| 812 | * @param use rname Username u sed to aut henticate (if any) | 933 | * @pa ram princi pal | |||
| 813 | * @param pas sword Password u sed to aut henticate (if any) | 934 |
*
|
|||
| 935 | * @pa ram authTy pe | |||||
| 936 |
*
|
|||||
| 937 | * @pa ram userna me | |||||
| 938 |
*
|
|||||
| 939 | * @pa ram passwo rd | |||||
| 940 |
*
|
|||||
| 814 | */ | 941 | */ | |||
| 815 |
public voi
d register
(Request r
equest, Ht
tpServletR
esponse re
sponse,
|
942 | public voi d register (Request r equest, Ht tpServletR esponse re sponse, Principal principal , | |||
| 816 | Pr incipal pr incipal, S tring auth Type, | 943 | String a uthType, S tring user name, Stri ng passwor d) { | |||
| 817 |
String
|
944 | re gister(req uest, resp onse, prin cipal, aut hType, use rname, pas sword, alw aysUseSess ion, cache ); | |||
| 945 | } | |||||
| 946 | ||||||
| 947 | ||||||
| 948 | privat e void reg ister(Requ est reques t, HttpSer vletRespon se respons e, Princip al princip al, | |||||
| 949 | String authType, String username, String pas sword , boolean al waysUseSes sion, | |||||
| 950 | boolean cache) { | |||||
| 818 | 951 | |||||
| 819 | if (log.isDe bugEnabled ()) { | 952 | if (log.isDe bugEnabled ()) { | |||
| 820 | String n ame = (pri ncipal == null) ? "n one" : pri ncipal.get Name(); | 953 | String n ame = (pri ncipal == null) ? "n one" : pri ncipal.get Name(); | |||
| 821 |
log.debug(
"Authentic
ated '" +
name + "'
with type
'" + authT
ype +
|
954 | log.debug( "Authentic ated '" + name + "' with type '" + authT ype + "'"); | |||
| 822 | "'"); | |||||
| 823 | } | 955 | } | |||
| 824 | 956 | |||||
| 825 | // Cache the authentic ation info rmation in our reque st | 957 | // Cache the authentic ation info rmation in our reque st | |||
| 826 | re quest.setA uthType(au thType); | 958 | re quest.setA uthType(au thType); | |||
| 827 | re quest.setU serPrincip al(princip al); | 959 | re quest.setU serPrincip al(princip al); | |||
| 828 | 960 | |||||
| 829 | Se ssion sess ion = requ est.getSes sionIntern al(false); | 961 | Se ssion sess ion = requ est.getSes sionIntern al(false); | |||
| 830 | 962 | |||||
| 831 | if (session != null) { | 963 | if (session != null) { | |||
| 832 | // If th e principa l is null then this is a logou t. No need to change | 964 | // If th e principa l is null then this is a logou t. No need to change | |||
| 833 | // the s ession ID. See BZ 59 043. | 965 | // the s ession ID. See BZ 59 043. | |||
| 834 | if (chan geSessionI dOnAuthent ication && principal != null) { | 966 | if (chan geSessionI dOnAuthent ication && principal != null) { | |||
| 835 | Stri ng oldId = null; | 967 | Stri ng oldId = null; | |||
| 836 | if ( log.isDebu gEnabled() ) { | 968 | if ( log.isDebu gEnabled() ) { | |||
| 837 | oldId = se ssion.getI d(); | 969 | oldId = se ssion.getI d(); | |||
| 838 | } | 970 | } | |||
| 839 | Mana ger manage r = reques t.getConte xt().getMa nager(); | 971 | Mana ger manage r = reques t.getConte xt().getMa nager(); | |||
| 840 | mana ger.change SessionId( session); | 972 | mana ger.change SessionId( session); | |||
| 841 | requ est.change SessionId( session.ge tId()); | 973 | requ est.change SessionId( session.ge tId()); | |||
| 842 | if ( log.isDebu gEnabled() ) { | 974 | if ( log.isDebu gEnabled() ) { | |||
| 843 | log.debug( sm.getStri ng("authen ticator.ch angeSessio nId", | 975 | log.debug( sm.getStri ng("authen ticator.ch angeSessio nId", | |||
| 844 | ol dId, sessi on.getId() )); | 976 | ol dId, sessi on.getId() )); | |||
| 845 | } | 977 | } | |||
| 846 | } | 978 | } | |||
| 847 | } else if (a lwaysUseSe ssion) { | 979 | } else if (a lwaysUseSe ssion) { | |||
| 848 | session = request. getSession Internal(t rue); | 980 | session = request. getSession Internal(t rue); | |||
| 849 | } | 981 | } | |||
| 850 | 982 | |||||
| 851 | // Cache the authentic ation info rmation in our sessi on, if any | 983 | // Cache the authentic ation info rmation in our sessi on, if any | |||
| 852 | if (cache) { | 984 | if (cache) { | |||
| 853 | if (sess ion != nul l) { | 985 | if (sess ion != nul l) { | |||
| 854 | sess ion.setAut hType(auth Type); | 986 | sess ion.setAut hType(auth Type); | |||
| 855 | sess ion.setPri ncipal(pri ncipal); | 987 | sess ion.setPri ncipal(pri ncipal); | |||
| 856 | if ( username ! = null) { | 988 | if ( username ! = null) { | |||
| 857 | session.se tNote(Cons tants.SESS _USERNAME_ NOTE, user name); | 989 | session.se tNote(Cons tants.SESS _USERNAME_ NOTE, user name); | |||
| 858 | } el se { | 990 | } el se { | |||
| 859 | session.re moveNote(C onstants.S ESS_USERNA ME_NOTE); | 991 | session.re moveNote(C onstants.S ESS_USERNA ME_NOTE); | |||
| 860 | } | 992 | } | |||
| 861 | if ( password ! = null) { | 993 | if ( password ! = null) { | |||
| 862 | session.se tNote(Cons tants.SESS _PASSWORD_ NOTE, pass word); | 994 | session.se tNote(Cons tants.SESS _PASSWORD_ NOTE, pass word); | |||
| 863 | } el se { | 995 | } el se { | |||
| 864 | session.re moveNote(C onstants.S ESS_PASSWO RD_NOTE); | 996 | session.re moveNote(C onstants.S ESS_PASSWO RD_NOTE); | |||
| 865 | } | 997 | } | |||
| 866 | } | 998 | } | |||
| 867 | } | 999 | } | |||
| 868 | 1000 | |||||
| 869 | // Construct a cookie to be retu rned to th e client | 1001 | // Construct a cookie to be retu rned to th e client | |||
| 870 | if (sso == n ull) { | 1002 | if (sso == n ull) { | |||
| 871 | return; | 1003 | return; | |||
| 872 | } | 1004 | } | |||
| 873 | 1005 | |||||
| 874 | // Only crea te a new S SO entry i f the SSO did not al ready set a note | 1006 | // Only crea te a new S SO entry i f the SSO did not al ready set a note | |||
| 875 | // for an ex isting ent ry (as it would do w ith subseq uent reque sts | 1007 | // for an ex isting ent ry (as it would do w ith subseq uent reque sts | |||
| 876 | // for DIGES T and SSL authentica ted contex ts) | 1008 | // for DIGES T and SSL authentica ted contex ts) | |||
| 877 | St ring ssoId = (String ) request. getNote(Co nstants.RE Q_SSOID_NO TE); | 1009 | St ring ssoId = (String ) request. getNote(Co nstants.RE Q_SSOID_NO TE); | |||
| 878 | if (ssoId == null) { | 1010 | if (ssoId == null) { | |||
| 879 | // Const ruct a coo kie to be returned t o the clie nt | 1011 | // Const ruct a coo kie to be returned t o the clie nt | |||
| 880 | ssoId = sessionIdG enerator.g enerateSes sionId(); | 1012 | ssoId = sessionIdG enerator.g enerateSes sionId(); | |||
| 881 | Cookie c ookie = ne w Cookie(C onstants.S INGLE_SIGN _ON_COOKIE , ssoId); | 1013 | Cookie c ookie = ne w Cookie(C onstants.S INGLE_SIGN _ON_COOKIE , ssoId); | |||
| 882 | cookie.s etMaxAge(- 1); | 1014 | cookie.s etMaxAge(- 1); | |||
| 883 | cookie.s etPath("/" ); | 1015 | cookie.s etPath("/" ); | |||
| 884 | 1016 | |||||
| 885 | // Bugzi lla 41217 | 1017 | // Bugzi lla 41217 | |||
| 886 | cookie.s etSecure(r equest.isS ecure()); | 1018 | cookie.s etSecure(r equest.isS ecure()); | |||
| 887 | 1019 | |||||
| 888 | // Bugzi lla 34724 | 1020 | // Bugzi lla 34724 | |||
| 889 | String s soDomain = sso.getCo okieDomain (); | 1021 | String s soDomain = sso.getCo okieDomain (); | |||
| 890 |
if
|
1022 | if (ssoDomain != null) { | |||
| 891 | cook ie.setDoma in(ssoDoma in); | 1023 | cook ie.setDoma in(ssoDoma in); | |||
| 892 | } | 1024 | } | |||
| 893 | 1025 | |||||
| 894 | // Configu re httpOnl y on SSO c ookie usin g same rul es as sess ion cookies | 1026 |
// Configu
re httpOnl
y on SSO c
ookie usin
g same rul
es as sess
ion
|
|||
| 895 | if (reques t.getServl etContext( ).getSessi onCookieCo nfig().isH ttpOnly() || | 1027 | // cooki es | |||
| 896 |
|
1028 |
if (reques
t.getServl
etContext(
).getSessi
onCookieCo
nfig().isH
ttpOnly()
|
|||
| 1029 | || request.ge tContext() .getUseHtt pOnly()) { | |||||
| 897 | cook ie.setHttp Only(true) ; | 1030 | cook ie.setHttp Only(true) ; | |||
| 898 | } | 1031 | } | |||
| 899 | 1032 | |||||
| 900 | response .addCookie (cookie); | 1033 | response .addCookie (cookie); | |||
| 901 | 1034 | |||||
| 902 | // Regis ter this p rincipal w ith our SS O valve | 1035 | // Regis ter this p rincipal w ith our SS O valve | |||
| 903 | sso.regi ster(ssoId , principa l, authTyp e, usernam e, passwor d); | 1036 | sso.regi ster(ssoId , principa l, authTyp e, usernam e, passwor d); | |||
| 904 | request. setNote(Co nstants.RE Q_SSOID_NO TE, ssoId) ; | 1037 | request. setNote(Co nstants.RE Q_SSOID_NO TE, ssoId) ; | |||
| 905 | 1038 | |||||
| 906 | } else { | 1039 | } else { | |||
| 907 | if (prin cipal == n ull) { | 1040 | if (prin cipal == n ull) { | |||
| 908 | // R egistering a program matic logo ut | 1041 | // R egistering a program matic logo ut | |||
| 909 | sso. deregister (ssoId); | 1042 | sso. deregister (ssoId); | |||
| 910 | requ est.remove Note(Const ants.REQ_S SOID_NOTE) ; | 1043 | requ est.remove Note(Const ants.REQ_S SOID_NOTE) ; | |||
| 911 | retu rn; | 1044 | retu rn; | |||
| 912 | } else { | 1045 | } else { | |||
| 913 | // U pdate the SSO sessio n with the latest au thenticati on data | 1046 | // U pdate the SSO sessio n with the latest au thenticati on data | |||
| 914 | sso. update(sso Id, princi pal, authT ype, usern ame, passw ord); | 1047 | sso. update(sso Id, princi pal, authT ype, usern ame, passw ord); | |||
| 915 | } | 1048 | } | |||
| 916 | } | 1049 | } | |||
| 917 | 1050 | |||||
| 918 | // Fix for B ug 10040 | 1051 | // Fix for B ug 10040 | |||
| 919 | // Always as sociate a session wi th a new S SO reqistr ation. | 1052 | // Always as sociate a session wi th a new S SO reqistr ation. | |||
| 920 | // SSO entri es are onl y removed from the S SO registr y map when | 1053 | // SSO entri es are onl y removed from the S SO registr y map when | |||
| 921 | // associate d sessions are destr oyed; if a new SSO e ntry is cr eated | 1054 | // associate d sessions are destr oyed; if a new SSO e ntry is cr eated | |||
| 922 | // above for this requ est and th e user nev er revisit s the cont ext, the | 1055 | // above for this requ est and th e user nev er revisit s the cont ext, the | |||
| 923 | // SSO entry will neve r be clear ed if we d on't assoc iate the s ession | 1056 | // SSO entry will neve r be clear ed if we d on't assoc iate the s ession | |||
| 924 | if (session == null) { | 1057 | if (session == null) { | |||
| 925 | session = request. getSession Internal(t rue); | 1058 | session = request. getSession Internal(t rue); | |||
| 926 | } | 1059 | } | |||
| 927 | ss o.associat e(ssoId, s ession); | 1060 | ss o.associat e(ssoId, s ession); | |||
| 928 | 1061 | |||||
| 929 | } | 1062 | } | |||
| 930 | 1063 | |||||
| 931 | @Overr ide | 1064 | @Overr ide | |||
| 932 |
public voi
d login(St
ring usern
ame, Strin
g password
, Request
request)
|
1065 | public voi d login(St ring usern ame, Strin g password , Request request) throws Se rvletExcep tion { | |||
| 933 | throws S ervletExce ption { | |||||
| 934 | Pr incipal pr incipal = doLogin(re quest, use rname, pas sword); | 1066 | Pr incipal pr incipal = doLogin(re quest, use rname, pas sword); | |||
| 935 |
register(r
equest, re
quest.getR
esponse(),
principal
,
|
1067 | register(r equest, re quest.getR esponse(), principal , getAuthMe thod(), us ername, pa ssword); | |||
| 936 | getAuthMet hod(), use rname, pas sword); | |||||
| 937 | } | 1068 | } | |||
| 938 | 1069 | |||||
| 939 | protec ted abstra ct String getAuthMet hod(); | 1070 | protec ted abstra ct String getAuthMet hod(); | |||
| 940 | 1071 | |||||
| 941 | /** | 1072 | /** | |||
| 942 | * Pro cess the l ogin reque st. | 1073 | * Pro cess the l ogin reque st. | |||
| 943 | * | 1074 | * | |||
| 944 | * @param r equest Associated request | 1075 |
* @param r
equest
|
|||
| 945 |
* @param
usern
a
me
The u
s
e
r
|
1076 | * As sociated r equest | |||
| 946 | * @param pas sword The passwo rd | 1077 | * @pa ram userna me | |||
| 1078 | * Th e user | |||||
| 1079 |
* @param
p
a
|
|||||
| 1080 |
*
|
|||||
| 947 | * @re turn The au thenticate d Principa l | 1081 | * @re turn The a uthenticat ed Princip al | |||
| 948 | * @th rows Servl etExceptio n | 1082 | * @th rows Servl etExceptio n | |||
| 1083 | * N o principa l was auth enticated with the s pecified c redentials | |||||
| 949 | */ | 1084 | */ | |||
| 950 |
protected
Principal
doLogin(Re
quest requ
est, Strin
g username
,
|
1085 | protected Principal doLogin(Re quest requ est, Strin g username , String pa ssword) | |||
| 951 | String pas sword) throws Ser vletExcept ion { | 1086 |
|
|||
| 952 | Pr incipal p = context. getRealm() .authentic ate(userna me, passwo rd); | 1087 | Pr incipal p = context. getRealm() .authentic ate(userna me, passwo rd); | |||
| 953 | if (p == nul l) { | 1088 | if (p == nul l) { | |||
| 954 | throw ne w ServletE xception(s m.getStrin g("authent icator.log inFail")); | 1089 | throw ne w ServletE xception(s m.getStrin g("authent icator.log inFail")); | |||
| 955 | } | 1090 | } | |||
| 956 | re turn p; | 1091 | re turn p; | |||
| 957 | } | 1092 | } | |||
| 958 | 1093 | |||||
| 959 | @Overr ide | 1094 | @Overr ide | |||
| 960 | public void logo ut(Request request) { | 1095 | public void logo ut(Request request) { | |||
| 1096 | Au thConfigPr ovider pro vider = ge tJaspicPro vider(); | |||||
| 1097 | if (provider != null) { | |||||
| 1098 | MessageI nfo messag eInfo = ne w MessageI nfoImpl(re quest, req uest.getRe sponse(), true); | |||||
| 1099 | Subject client = ( Subject) r equest.get Note(Const ants.REQ_J ASPIC_SUBJ ECT_NOTE); | |||||
| 1100 | if (clie nt == null ) { | |||||
| 1101 | retu rn; | |||||
| 1102 | } | |||||
| 1103 | ||||||
| 1104 | ServerAu thContext serverAuth Context; | |||||
| 1105 | try { | |||||
| 1106 | Serv erAuthConf ig serverA uthConfig = provider .getServer AuthConfig ("HttpServ let", | |||||
| 1107 | jaspic AppContext ID, Callba ckHandlerI mpl.getIns tance()); | |||||
| 1108 | Stri ng authCon textID = s erverAuthC onfig.getA uthContext ID(message Info); | |||||
| 1109 | serv erAuthCont ext = serv erAuthConf ig.getAuth Context(au thContextI D, null, n ull); | |||||
| 1110 | serv erAuthCont ext.cleanS ubject(mes sageInfo, client); | |||||
| 1111 | } catch (AuthExcep tion e) { | |||||
| 1112 | log. debug(sm.g etString(" authentica tor.jaspic CleanSubje ctFail"), e); | |||||
| 1113 | } | |||||
| 1114 | } | |||||
| 1115 | ||||||
| 961 | Pr incipal p = request. getPrincip al(); | 1116 | Pr incipal p = request. getPrincip al(); | |||
| 962 | if (p instan ceof Tomca tPrincipal ) { | 1117 | if (p instan ceof Tomca tPrincipal ) { | |||
| 963 | try { | 1118 | try { | |||
| 964 | ((To mcatPrinci pal) p).lo gout(); | 1119 | ((To mcatPrinci pal) p).lo gout(); | |||
| 965 | } catch (Throwable t) { | 1120 | } catch (Throwable t) { | |||
| 966 | Exce ptionUtils .handleThr owable(t); | 1121 | Exce ptionUtils .handleThr owable(t); | |||
| 967 | log. debug(sm.g etString(" authentica tor.tomcat PrincipalL ogoutFail" ), t); | 1122 | log. debug(sm.g etString(" authentica tor.tomcat PrincipalL ogoutFail" ), t); | |||
| 968 | } | 1123 | } | |||
| 969 | } | 1124 | } | |||
| 970 | 1125 | |||||
| 971 | re gister(req uest, requ est.getRes ponse(), n ull, null, null, nul l); | 1126 | re gister(req uest, requ est.getRes ponse(), n ull, null, null, nul l); | |||
| 972 | } | 1127 | } | |||
| 973 | 1128 | |||||
| 1129 | ||||||
| 974 | /** | 1130 | /** | |||
| 975 |
* Start th
is compone
nt and imp
lement the
requireme
nts
|
1131 | * Start th is compone nt and imp lement the requireme nts of | |||
| 976 | * of {@link org .apache.ca talina.uti l.Lifecycl eBase#star tInternal( )}. | 1132 |
*
|
|||
| 977 | * | 1133 | * | |||
| 978 | * @excepti on Lifecyc leExceptio n if this c omponent d etects a f atal error | 1134 |
* @excepti
on Lifecyc
leExceptio
n
|
|||
| 979 | * that preve nts this component from being used | 1135 | * if this component detects a fatal erro r that pre vents this | |||
| 1136 |
*
|
|||||
| 980 | */ | 1137 | */ | |||
| 981 | @Overr ide | 1138 | @Overr ide | |||
| 982 | protec ted synchr onized voi d startInt ernal() th rows Lifec ycleExcept ion { | 1139 | protec ted synchr onized voi d startInt ernal() th rows Lifec ycleExcept ion { | |||
| 1140 | Se rvletConte xt servlet Context = context.ge tServletCo ntext(); | |||||
| 1141 | ja spicAppCon textID = s ervletCont ext.getVir tualServer Name() + " " + | |||||
| 1142 | serv letContext .getContex tPath(); | |||||
| 983 | 1143 | |||||
| 984 | // Look up t he SingleS ignOn impl ementation in our re quest proc essing | 1144 | // Look up t he SingleS ignOn impl ementation in our re quest proc essing | |||
| 985 | // path, if there is o ne | 1145 | // path, if there is o ne | |||
| 986 | Co ntainer pa rent = con text.getPa rent(); | 1146 | Co ntainer pa rent = con text.getPa rent(); | |||
| 987 | wh ile ((sso == null) & & (parent != null)) { | 1147 | wh ile ((sso == null) & & (parent != null)) { | |||
| 988 | Valve va lves[] = p arent.getP ipeline(). getValves( ); | 1148 | Valve va lves[] = p arent.getP ipeline(). getValves( ); | |||
| 989 | for (int i = 0; i < valves.l ength; i++ ) { | 1149 | for (int i = 0; i < valves.l ength; i++ ) { | |||
| 990 | if ( valves[i] instanceof SingleSig nOn) { | 1150 | if ( valves[i] instanceof SingleSig nOn) { | |||
| 991 | sso = (Sin gleSignOn) valves[i] ; | 1151 | sso = (Sin gleSignOn) valves[i] ; | |||
| 992 | break; | 1152 | break; | |||
| 993 | } | 1153 | } | |||
| 994 | } | 1154 | } | |||
| 995 | if (sso == null) { | 1155 | if (sso == null) { | |||
| 996 | pare nt = paren t.getParen t(); | 1156 | pare nt = paren t.getParen t(); | |||
| 997 | } | 1157 | } | |||
| 998 | } | 1158 | } | |||
| 999 | if (log.isDe bugEnabled ()) { | 1159 | if (log.isDe bugEnabled ()) { | |||
| 1000 | if (sso != null) { | 1160 | if (sso != null) { | |||
| 1001 | log. debug("Fou nd SingleS ignOn Valv e at " + s so); | 1161 | log. debug("Fou nd SingleS ignOn Valv e at " + s so); | |||
| 1002 | } else { | 1162 | } else { | |||
| 1003 | log. debug("No SingleSign On Valve i s present" ); | 1163 | log. debug("No SingleSign On Valve i s present" ); | |||
| 1004 | } | 1164 | } | |||
| 1005 | } | 1165 | } | |||
| 1006 | 1166 | |||||
| 1007 | se ssionIdGen erator = n ew Standar dSessionId Generator( ); | 1167 | se ssionIdGen erator = n ew Standar dSessionId Generator( ); | |||
| 1008 | se ssionIdGen erator.set SecureRand omAlgorith m(getSecur eRandomAlg orithm()); | 1168 | se ssionIdGen erator.set SecureRand omAlgorith m(getSecur eRandomAlg orithm()); | |||
| 1009 | se ssionIdGen erator.set SecureRand omClass(ge tSecureRan domClass() ); | 1169 | se ssionIdGen erator.set SecureRand omClass(ge tSecureRan domClass() ); | |||
| 1010 | se ssionIdGen erator.set SecureRand omProvider (getSecure RandomProv ider()); | 1170 | se ssionIdGen erator.set SecureRand omProvider (getSecure RandomProv ider()); | |||
| 1011 | 1171 | |||||
| 1012 | su per.startI nternal(); | 1172 | su per.startI nternal(); | |||
| 1013 | } | 1173 | } | |||
| 1014 | 1174 | |||||
| 1015 | ||||||
| 1016 | /** | 1175 | /** | |||
| 1017 |
* Stop thi
s componen
t and impl
ement the
requiremen
ts
|
1176 | * Stop thi s componen t and impl ement the requiremen ts of | |||
| 1018 | * of {@link org .apache.ca talina.uti l.Lifecycl eBase#stop Internal() }. | 1177 |
*
|
|||
| 1019 | * | 1178 | * | |||
| 1020 | * @excepti on Lifecyc leExceptio n if this c omponent d etects a f atal error | 1179 |
* @excepti
on Lifecyc
leExceptio
n
|
|||
| 1021 | * that preve nts this component from being used | 1180 | * if this component detects a fatal erro r that pre vents this | |||
| 1181 |
*
|
|||||
| 1022 | */ | 1182 | */ | |||
| 1023 | @Overr ide | 1183 | @Overr ide | |||
| 1024 | protec ted synchr onized voi d stopInte rnal() thr ows Lifecy cleExcepti on { | 1184 | protec ted synchr onized voi d stopInte rnal() thr ows Lifecy cleExcepti on { | |||
| 1025 | 1185 | |||||
| 1026 | su per.stopIn ternal(); | 1186 | su per.stopIn ternal(); | |||
| 1027 | 1187 | |||||
| 1028 | ss o = null; | 1188 | ss o = null; | |||
| 1029 | } | 1189 | } | |||
| 1190 | ||||||
| 1191 | ||||||
| 1192 | privat e AuthConf igProvider getJaspic Provider() { | |||||
| 1193 | Au thConfigPr ovider pro vider = ja spicProvid er; | |||||
| 1194 | if (provider == null) { | |||||
| 1195 | provider = findJas picProvide r(); | |||||
| 1196 | } | |||||
| 1197 | if (provider == NO_PRO VIDER_AVAI LABLE) { | |||||
| 1198 | return n ull; | |||||
| 1199 | } | |||||
| 1200 | re turn provi der; | |||||
| 1201 | } | |||||
| 1202 | ||||||
| 1203 | ||||||
| 1204 | privat e AuthConf igProvider findJaspi cProvider( ) { | |||||
| 1205 | Au thConfigFa ctory fact ory = Auth ConfigFact ory.getFac tory(); | |||||
| 1206 | Au thConfigPr ovider pro vider = nu ll; | |||||
| 1207 | if (factory != null) { | |||||
| 1208 | provider = factory .getConfig Provider(" HttpServle t", jaspic AppContext ID, this); | |||||
| 1209 | } | |||||
| 1210 | if (provider == null) { | |||||
| 1211 | provider = NO_PROV IDER_AVAIL ABLE; | |||||
| 1212 | } | |||||
| 1213 | ja spicProvid er = provi der; | |||||
| 1214 | re turn provi der; | |||||
| 1215 | } | |||||
| 1216 | ||||||
| 1217 | ||||||
| 1218 | @Overr ide | |||||
| 1219 | public void noti fy(String layer, Str ing appCon text) { | |||||
| 1220 | fi ndJaspicPr ovider(); | |||||
| 1221 | } | |||||
| 1222 | ||||||
| 1223 | ||||||
| 1224 | privat e static c lass Jaspi cState { | |||||
| 1225 | pu blic Messa geInfo mes sageInfo = null; | |||||
| 1226 | pu blic Serve rAuthConte xt serverA uthContext = null; | |||||
| 1227 | } | |||||
| 1228 | ||||||
| 1229 | ||||||
| 1230 | privat e static c lass NoOpA uthConfigP rovider im plements A uthConfigP rovider { | |||||
| 1231 | ||||||
| 1232 | @O verride | |||||
| 1233 | pu blic Clien tAuthConfi g getClien tAuthConfi g(String l ayer, Stri ng appCont ext, Callb ackHandler handler) | |||||
| 1234 | thro ws AuthExc eption { | |||||
| 1235 | return n ull; | |||||
| 1236 | } | |||||
| 1237 | ||||||
| 1238 | @O verride | |||||
| 1239 | pu blic Serve rAuthConfi g getServe rAuthConfi g(String l ayer, Stri ng appCont ext, Callb ackHandler handler) | |||||
| 1240 | thro ws AuthExc eption { | |||||
| 1241 | return n ull; | |||||
| 1242 | } | |||||
| 1243 | ||||||
| 1244 | @O verride | |||||
| 1245 | pu blic void refresh() { | |||||
| 1246 | } | |||||
| 1247 | } | |||||
| 1030 | } | 1248 | } |
Araxis Merge (but not the data content of this report) is Copyright © 1993–2017 Araxis Ltd (www.araxis.com). All rights reserved.