Desenvolvendo com APIs de Segurança Programática para Aplicativos da Web
Utilize essas informações para proteger programaticamente APIs para aplicativos da Web.
Antes de Iniciar
A segurança programática é utilizada por aplicativos cientes de segurança quando a segurança declarativa por si só não é suficiente para expressar o modelo de segurança do aplicativo.
As APIs de logout, login e autenticação são novas para Java™ Servlet 3.0 nesse release do WebSphere Application Server.
É possível configurar várias opções para autenticação da Web que determinam como o Web client interage com Identificador Uniforme de Recursos protegidos e desprotegidos. Também, você pode especificar se o WebSphere Application Server desafia o Web client quanto às informações básicas de autenticação se a autenticação do certificado para cliente HTTPS falhar. Para obter informações adicionais, consulte o artigo Selecionando um Mecanismo de Autenticação.
É possível ativar um módulo de login para indicar qual classe principal
é retornada por essas chamadas. Consulte
o tópico sobre como mapear um principal de registro para um ID do usuário do
System Authorization Facility usando um módulo de login de Java Authentication
and Authorization Services para obter mais informações.
Quando o método isUserInRole é usado, declare um elemento security-role-ref no descritor de implementação com um subelemento de nome da função contendo o nome da função que é transmitida para esse método, ou utilize a anotação de @DeclareRoles. Como funções reais são criadas durante o estágio de montagem do aplicativo, é possível utilizar uma função lógica como o nome da função e fornecer dicas suficientes ao assembler na descrição do elemento security-role-ref para vincular essa função à função real. Durante a montagem, o assembler cria um sub elemento role-link para vincular o nome da função à função em si. Criação de um elemento security-role-ref é possível se uma ferramenta do conjunto, como o Rational Application Developer, for usada. Também é possível criar o elemento security-role-ref durante o estágio de montagem utilizando uma ferramenta de montagem.
Procedimento
- Adicione os métodos de segurança requeridos ao código do servlet.
- Crie um elemento security-role-ref com o campo role-name. Se um elemento security-role-ref não for criado durante o desenvolvimento, certifique-se de que seja criado durante o estágio de montagem.
Resultados
Exemplo
<security-role-ref>
<description>Fornece dicas ao assembler para vincular esse nome de função
a uma função real aqui<\description>
<role-name>Mgr<\role-name>
</security-role-ref>
<security-role-ref>
<description>Dicas fornecidas pelo desenvolvedor para mapear o nome da função
para role-link</description>
<role-name>Mgr</role-name>
<role-link>Manager</role-link>
</security-role-ref>
public void doGet(HttpServletRequest request,
HttpServletResponse response) {
....
// efetuar logoff do usuário atual
request.logout();
// efetuar login com um novo usuário
request.login(“bob”,”bobpwd”)
// obter o usuário remoto utilizando getUserPrincipal()
java.security.Principal principal = request.getUserPrincipal();
String remoteUser = principal.getName();
// obter o usuário remoto utilizando getRemoteUser()
remoteUser = request.getRemoteUser();
// verificar se o usuário remoto obteve a função de Mgr
boolean isMgr = request.isUserInRole("Mgr");
// utilize as informações acima de qualquer maneira necessária ao
// aplicativo
....
}
public void doGet(HttpServletRequest request,
HttpServletResponse response) {
....
// efetuar logout do usuário atual. Se você ainda não estiver
autenticado, então não precisa chamar o método logout().
request.logout();
// efetuar login com um novo usuário
request.login(“utle”,”mypwd”)
// o assunto utle do usuário agora definido no encadeamento e
o cookie de LTPA SSO é definido na resposta
....
}
public void doGet(HttpServletRequest request,
HttpServletResponse response) {
....
// efetuar logout do usuário atual. Se você ainda não estiver
autenticado, então não precisa chamar o método logout().
// efetuar login com um novo usuário
request.authenticate(response);
// o assunto de novo usuário agora definido no encadeamento e o
cookie de LTPA SSO é definido na resposta
....
}
@javax.annotation.security.DeclareRoles("Mgr")
public void doGet(HttpServletRequest request,
HttpServletResponse response) {
....
// obter o usuário remoto utilizando getUserPrincipal()
java.security.Principal principal = request.getUserPrincipal();
String remoteUser = principal.getName();
// obter o usuário remoto utilizando getRemoteUser()
remoteUser = request.getRemoteUser();
// verificar se o usuário remoto obteve a função de Mgr
boolean isMgr = request.isUserInRole("Mgr");
// utilize as informações acima de qualquer maneira necessária ao
// aplicativo
....
}
O exemplo a seguir retrata um aplicativo da Web ou servlet utilizando o modelo de segurança programática.
Esse exemplo ilustra um uso e não necessariamente o único uso do modelo de segurança programática. O aplicativo pode utilizar as informações que são retornadas pelos métodos getUserPrincipal, isUserInRole e getRemoteUser de qualquer outra maneira que seja significativa para esse aplicativo. Utilize o modelo de segurança declarativa sempre que possível.
Arquivo : HelloServlet.java
public class HelloServlet extends javax.servlet.http.HttpServlet {
public void doPost(
javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response)
throws javax.servlet.ServletException, java.io.IOException {
}
public void doGet(
javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response)
throws javax.servlet.ServletException, java.io.IOException {
String s = "Hello";
// obtenha o usuário remoto utilizando getUserPrincipal()
java.security.Principal principal = request.getUserPrincipal();
String remoteUserName = "";
if( principal != null )
remoteUserName = principal.getName();
// obtenha o usuário remoto utilizando getRemoteUser()
String remoteUser = request.getRemoteUser();
// verifique se o usuário remoto possui função de Mgr
boolean isMgr = request.isUserInRole("Mgr");
// display Hello username for managers and bob.
if ( isMgr || remoteUserName.equals("bob") )
s = "Hello " + remoteUserName;
String message = "<html> \n" +
"<head><title>Hello Servlet</title></head>\n" +
"<body> /n +"
"<h1> " +s+ </h1>/n " +
byte[] bytes = message.getBytes();
// exibe "Hello" para usuários habituais
// e exibe "Nome do usuário Hello" para gerenciadores e "bob".
response.getOutputStream().write(bytes);
}
}
<security-role-ref>
<description> </description>
<role-name>Mgr</role-name>
</security-role-ref>