O WebSphere Application
Server suporta a conexão em um módulo de login do JAAS (Java™ Authentication and Authorization Service)
customizado antes ou depois do módulo de login do sistema WebSphere Application
Server. Entretanto, o WebSphere Application Server não suporta a
substituição dos módulos de login do sistema WebSphere Application Server,
que são utilizados para criar a credencial WSCredential e o principal WSPrincipal
no Subject. Ao utilizar um módulo de login customizado, é possível tomar decisões de
autenticação adicionais, ou incluir informações para que o Subject tome decisões
de autorização adicionais e potencialmente rígidas em um aplicativo Java EE (Java Platform, Enterprise Edition).
Sobre Esta Tarefa
O WebSphere Application
Server permite que você propague o recebimento de dados de informações incluído no
Subject por um módulo de login customizado. Para obter mais informações, consulte Propagação de Atributo de Segurança. Para determinar qual configuração de login deve ser utilizada para conectar seus módulo de login customizados, consulte as
descrições das configurações de login localizadas no
artigo Definições de Entrada de Configuração de Login do Sistema para o Java Authentication and Authorization Service.
O WebSphere Application
Server suporta a modificação da configuração do login do sistema utilizando o
console administrativo e o utilitário de script wsadmin. Para fazer a configuração de login do sistema utilizando o console administrativo, clique em Segurança > Segurança Global. Em Java Authentication and Authorization Service,
clique em Logins do sistema.
Procedimento
- Configure uma configuração de login do sistema.
Consulte a amostra de código a seguir para configurar uma configuração de login do sistema utilizando a ferramenta wsadmin. O
script de Jacl a seguir inclui um módulo de login customizado na
configuração de login do sistema da Web do Lightweight Third-party Authentication (LTPA).
Atenção: As linhas 32, 33
e 34 nas amostras de código a seguir são divididas em duas linhas.
1. #########################################
2. #
3. # Abra o security.xml
4. #
5. #########################################
6.
7.
8. set sec [$AdminConfig getid /Cell:hillside/Security:/]
9.
10.
11. #########################################
12. #
13. # Localize o systemLoginConfig
14. #
15. #########################################
16.
17.
18. set slc [$AdminConfig showAttribute $sec systemLoginConfig]
19.
20. set entries [lindex [$AdminConfig showAttribute $slc entries] 0]
21.
22.
23. #########################################
24. #
25. # Anexe um novo LoginModule ao LTPA_WEB
26. #
27. #########################################
28.
29. foreach entry $entries {
30. set alias [$AdminConfig showAttribute $entry alias]
31. if {$alias == "LTPA_WEB"} {
32. set newJAASLoginModuleId [$AdminConfig create JAASLoginModule
$entry {{moduleClassName
"com.ibm.ws.security.common.auth.module.proxy.WSLoginModuleProxy"}}]
33. set newPropertyId [$AdminConfig create Property $newJAASLoginModuleId
{{name delegate}{value "com.ABC.security.auth.CustomLoginModule"}}]
34. $AdminConfig modify $newJAASLoginModuleId
{{authenticationStrategy REQUIRED}}
35. break
36. }
37. }
38.
39.
40. #########################################
41. #
42. # salve a alteração
43. #
44. #########################################
45.
46. $AdminConfig save 47.
Atenção: O utilitário de script wsadmin insere um novo objeto no final da lista.
Para inserir o módulo de login customizado antes
do módulo de login AuthenLoginModule, exclua o módulo de login AuthenLoginModule
e recrie-o depois de inserir o módulo de login customizado. Salve o script da amostra em um arquivo
sample.jacl
e execute o script da amostra usando o comando a seguir:
wsadmin -f sample.jacl
- Remova a configuração de login atual LTPA_WEB e todos os módulos de login.
É possível
utilizar o seguinte script Jacl de amostra para remover a configuração de login LTPA_WEB
atual e todos os módulos de login:
48. #########################################
49. #
50. # Abra o security.xml
51. #
52. #########################################
53.
54.
55. set sec [$AdminConfig getid /Cell:hillside/Security:/]
56.
57.
58. #########################################
59. #
60. # Localize o systemLoginConfig
61. #
62. #########################################
63.
64.
65. set slc [$AdminConfig showAttribute $sec systemLoginConfig]
66.
67. set entries [lindex [$AdminConfig showAttribute $slc entries] 0]
68.
69.
70. #########################################
71. #
72. # Remova a configuração de login do LTPA_WEB
73. #
74. #########################################
75.
76. foreach entry $entries {
77. set alias [$AdminConfig showAttribute $entry alias]
78. if {$alias == "LTPA_WEB"} {
79. $AdminConfig remove $entry
80. break 81. }
82. }
83.
84.
85. #########################################
86. #
87. # salve a alteração
88. #
89. #########################################
90.
91. $AdminConfig save
- Recupere a configuração original LTPA_WEB.
É possível utilizar o seguinte script Jacl de amostra para recuperar
a configuração LTPA_WEB original:
Atenção: As linhas 122, 124 e 126 nas
amostras de código a seguir são divididas em duas ou mais linhas apenas para
propósitos ilustrativos.
92. #########################################
93. #
94. # Abra o security.xml
95. #
96. #########################################
97.
98.
99. set sec [$AdminConfig getid /Cell:hillside/Security:/]
100.
101.
102. #########################################
103. #
104. # Localize o systemLoginConfig
105. #
106. #########################################
107.
108.
109. set slc [$AdminConfig showAttribute $sec systemLoginConfig]
110.
111. set entries [lindex [$AdminConfig showAttribute $slc entries] 0]
112.
113.
114.
115. #########################################
116. #
117. # Recrie a configuração de login do LTPA_WEB
118. #
119. #########################################
120.
121.
122. set newJAASConfigurationEntryId [$AdminConfig create
JAASConfigurationEntry $slc {{alias LTPA_WEB}}]
123.
124. set newJAASLoginModuleId [$AdminConfig create
JAASLoginModule $newJAASConfigurationEntryId
{{moduleClassName
"com.ibm.ws.security.common.auth.module.proxy.WSLoginModuleProxy"}}]
125.
126. set newPropertyId [$AdminConfig create Property
$newJAASLoginModuleId {{name delegate}{value "com.ibm.ws.security.web.AuthenLoginModule"}}]
127.
128. $AdminConfig modify $newJAASLoginModuleId
{{authenticationStrategy REQUIRED}}
129.
130.
131. #########################################
132. #
133. # salve a alteração
134. #
135. #########################################
136.
137. $AdminConfig save
- Faça o ltpaLoginModule inicializar a matriz de retorno de chamada no método de login.
Os módulos de login do WebSphere Application Server Versão ltpaLoginModule
e AuthenLoginModule utilizam o estado compartilhado para salvar as informações de estado
para que os módulos de login customizados possam modificar as informações. O módulo de login ltpaLoginModule
inicializa a matriz de retorno de chamada no método de login usando o código
a seguir. A matriz de retorno de chamada é criada pelo módulo de login ltpaLoginModule
apenas se uma matriz não estiver definida na área de estado compartilhado. Na amostra
de código a seguir, o código de manipulação de erro é removido para tornar a amostra concisa. Se você inserir um módulo de login customizado antes do módulo de login ltpaLoginModule,
o módulo de login customizado pode seguir o mesmo estilo para salvar o retorno de
chamada no estado compartilhado.
Atenção: Na
amostra de código a seguir, várias linhas de código foram divididas em duas linhas
apenas para fins ilustrativos.
138. Callback callbacks[] = null;
139. if (!sharedState.containsKey(
com.ibm.wsspi.security.auth.callback.Constants. CALLBACK_KEY)) {
140. callbacks = new Callback[3];
141. callbacks[0] = new NameCallback("Username: ");
142. callbacks[1] = new PasswordCallback("Password: ", false);
143. callbacks[2] = new com.ibm.websphere.security.auth.callback.
WSCredTokenCallbackImpl( "Credential Token: ");
144. try {
145. callbackHandler.handle(callbacks);
146. } catch (java.io.IOException e) {
147. . . .
148. } catch (UnsupportedCallbackException uce) {
149. . . .
150. }
151. sharedState.put( com.ibm.wsspi.security.auth.callback.
Constants.CALLBACK_KEY, callbacks);
152. } else {
153. callbacks = (Callback []) sharedState.get
( com.ibm.wsspi.security.auth.callback.Constants.CALLBACK_KEY);
154. }
- Faça o AuthenLoginModule inicializar a matriz de retorno de chamada.
Os módulos de login ltpaLoginModule e AuthenLoginModule
geram um objeto WSPrincipal e um objeto WSCredential para representar a identidade do
usuário autenticado e as credenciais de segurança. Os objetos WSPrincipal e WSCredential também são salvos no estado compartilhado. Um login JAAS utiliza um protocolo de registro de duas fases.
Primeiro, os métodos de login nos módulos de login, que são configurados na configuração de login, são chamados. Em seguida, seus métodos de registro são chamados. Um módulo de login customizado, inserido após os módulos de login ltpaLoginModule e AuthenLoginModule, pode modificar os objetos WSPrincipal e WSCredential antes
que eles sejam confirmados. Os objetos WSCredential e WSPrincipal devem existir no Assunto depois da conclusão do login. Sem
estes objetos no Assunto, o código de tempo de execução do WebSphere Application Server
rejeita o Assunto para tomar decisões de segurança.
AuthenLoginModule utiliza o seguinte código para inicializar a matriz de retorno de chamada:
Atenção: Na
amostra de código a seguir, várias linhas de código foram divididas em duas linhas
apenas para fins ilustrativos.
155. Callback callbacks[] = null;
156. if (!sharedState.containsKey( com.ibm.wsspi.security.auth.
callback.Constants.CALLBACK_KEY)) {
157. callbacks = new Callback[6];
158. callbacks[0] = new NameCallback("Username: ");
159. callbacks[1] = new PasswordCallback("Password: ", false);
160. callbacks[2] = new com.ibm.websphere.security.auth.callback.
WSCredTokenCallbackImpl( "Credential Token: ");
161. callbacks[3] = new com.ibm.wsspi.security.auth.callback.
WSServletRequestCallback ("HttpServletRequest: ");
162. callbacks[4] = new com.ibm.wsspi.security.auth.callback.
WSServletResponseCallback ("HttpServletResponse: ");
163. callbacks[5] = new com.ibm.wsspi.security.auth.callback.
WSAppContextCallback ("ApplicationContextCallback: ");
164. try {
165. callbackHandler.handle(callbacks);
166. } catch (java.io.IOException e) {
167. . . .
168. } catch (UnsupportedCallbackException uce {
169. . . .
170. }
171. sharedState.put( com.ibm.wsspi.security.auth.callback.
Constants.CALLBACK_KEY, callbacks);
172. } else {
173. callbacks = (Callback []) sharedState.get(com.ibm.wsspi.security.
auth.callback.Constants.CALLBACK_KEY);
174. }
- Obtenha o contexto do aplicativo. Mais três objetos, que contêm informações de retorno de
chamada para o login, são passadas do contêiner da Web para o módulo
de login AuthenLoginModule: um java.util.Map,
um HttpServletRequest e um objeto HttpServletResponse. Esses
objetos representam o contexto de aplicativo da Web.
É possível obter
o contexto do aplicativo, o objeto java.util.Map, chamando o método getContext()
no objeto WSAppContextCallback. O objeto java.util.Map é criado com as
informações do descritor de implementação a seguir.
Atenção: Na
amostra de código a seguir, várias linhas de código foram divididas em duas linhas
apenas para fins ilustrativos.
175. HashMap appContext = new HashMap(2);
176. appContext.put( com.ibm.wsspi.security.auth.callback.
Constants.WEB_APP_NAME,web_application_name);
177. appContext.put( com.ibm.wsspi.security.auth.callback.Constants.
REDIRECT_URL,errorPage);
O que Fazer Depois
O nome do aplicativo e o objeto HttpServletRequest podem
ser lidos pelo módulo de login customizado para desempenhar funções de mapeamento.
A
página de erro do login baseado em formulário pode ser modificada por um módulo de login customizado. Além da
estrutura JAAS, o WebSphere Application Server suporta o TAI
(Trust Association Interface).
Outros
tipos de credenciais e informações podem ser incluídos no Assunto do responsável pela chamada
durante o processo de autenticação usando um módulo de login customizado.
As credenciais de terceiros do responsável pela chamada Subject são gerenciadas pelo WebSphere Application Server como parte do contexto de segurança. O
Subject do responsável pela chamada é ligado ao encadeamento em execução durante o processamento do pedido. Quando
um módulo Enterprise
JavaBeans
(EJB) está configurado para usar a identidade de responsável pela
chamada, a identidade do usuário é propagada para o serviço de
recebimento de dados em um pedido EJB. A credencial WSCredential e quaisquer credenciais de terceiros
no Subject do responsável pela chamada não são propagadas no recebimento de dados. Em vez disso,
algumas das informações podem ser regeneradas no servidor de destino que
é baseado na identidade propagada. Inclua credenciais de terceiros no Subject do responsável pela chamada no estágio de autenticação. O Subject do responsável pela chamada, que é retornado do método WSSubject.getCallerSubject,
é de leitura e não pode ser modificado. Para obter mais informações sobre o subject WSSubject
consulte Obtendo o Subject do Responsável pela Chamada do Encadeamento para JAAS.