我正在使用Spring Security和Primefaces的应用程序。我需要输入您的凭据所需的所有操作。这必须由应用程序的管理员配置,该管理员可以禁用或启用大约70个实体中的所有操作(创建,编辑,查看,删除)的重新认证,配置值保存在我已调用SecurityContext的实体中几乎280个布尔人的领域。
我开发如下,它的工作原理,但问题是我有70个bean重复相同的代码和70个几乎相同的login.xhtml页面。我确定有更好的方法可以做到这一点,但我无法找到它。
在视图中:
<p:commandButton title="Guardar" actionListener="#{pedidoController.crearPedido}" update=":PedidoCreateForm,:growl " icon="ui-icon-disk" />
....
<ui:include src="login.xhtml"/>
Login.xhtml:
....
<p:dialog header="Iniciar sesión" closable="false" draggable="false" width="420" id="LoginDlg" widgetVar="LoginDialog" modal="true" resizable="false" appendTo="@(body)" >
<center>
<h:outputText value="Usuario o contraseña incorrectos" rendered="#{param.erro}" style="color: darkred"/>
</center>
<h:form id="LoginForm" >
<h:panelGrid columns="2" cellpadding="5">
<h:outputLabel for="j_username" value="Usuario: " />
<h:inputText id="j_username" binding="#{user}" required="true"/>
<h:outputLabel for="j_password" value="Contraseña: " />
<h:inputSecret id="j_password" binding="#{password}" required="true"/>
<h:commandButton action="#{pedidoController.login(user.value,password.value)}" value="Entrar"/>
<h:commandButton action="#{pedidoController.destroy()}" value="Cancelar"/>
</h:panelGrid>
</h:form>
</p:dialog>
...
管理员将配置值保存在已调用SecurityContext且具有280个布尔字段的实体中。
@Entity
@Table(name="core_securityContext")
public class SecurityContext implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;
@OneToOne(mappedBy="securityContext")
private Instancia instancia;
//solicitar credenciales para...-----GESTION----------
private boolean crearAlbaranes;
private boolean editarAlbaranes;
private boolean verAlbaranes;
private boolean borrarAlbaranes;
private boolean crearCajas;
private boolean editarCajas;
private boolean verCajas;
private boolean borrarCajas;
private boolean crearPedidos;
private boolean editarPedidos;
private boolean verPedidos;
private boolean borrarPedidos;
....
所有bean都扩展了这个类:
public abstract class SuperController {
protected EjecucionTrasLogin accion;
@Inject
protected Context context;
public void login(String user, String password){
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(user, password);
AuthenticationManager authenticationManager = (AuthenticationManager) getSpringBean("authenticationManager");
Authentication authenticate = authenticationManager.authenticate(token);
if(authenticate.isAuthenticated() ) {
if(accion != null ){
ejecutarAccion(accion);
}
}
}
public abstract void ejecutarAccion(EjecucionTrasLogin accion);
public EjecucionTrasLogin getAccion() {
return accion;
}
public void setAccion(EjecucionTrasLogin accion) {
this.accion = accion;
}
public void destroy(){
accion = null;
}
private Object getSpringBean(String name){
WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(
(ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext());
return ctx.getBean(name);
}
}
豆子就像这个PedidoController:
@Named("pedidoController")
@SessionScoped
public class PedidoController extends SuperController implements Serializable {
private static final long serialVersionUID = 3L;
@EJB
private com.gestion.dao.PedidoFacade ejbFacade;
private Pedido selected;
public PedidoController() {
}
public void ejecutarAccion(EjecucionTrasLogin accion){
switch(accion){
case CREAR_PEDIDOS:
create();
break;
case EDITAR_PEDIDOS:
update();
break;
case VER_PEDIDOS:
break;
case BORRAR_PEDIDOS:
destroy();
break;
}
}
public void crearPedido(){
if(context.getSecurityContext().isCrearPedidos()){
RequestContext con = RequestContext.getCurrentInstance();
accion = SecurityController.EjecucionTrasLogin.CREAR_PEDIDOS;
con.execute("PF('LoginDialog').show();");
//crear un hash aleatorio para la operacion
}else{
ejecutarAccion(SecurityController.EjecucionTrasLogin.CREAR_PEDIDOS);
}
}
public void editarPedido(){
if(context.getSecurityContext().isEditarPedidos()){
RequestContext con = RequestContext.getCurrentInstance();
con.execute("PF('LoginDialog').show();");
accion = SecurityController.EjecucionTrasLogin.EDITAR_PEDIDOS;
//crear un hash aleatorio para la operacion
}else{
ejecutarAccion(SecurityController.EjecucionTrasLogin.EDITAR_PEDIDOS);
}
}
public void verPedido(){
if(context.getSecurityContext().isVerPedidos()){
RequestContext con = RequestContext.getCurrentInstance();
con.execute("PF('LoginDialog').show();");
accion = SecurityController.EjecucionTrasLogin.VER_PEDIDOS;
//crear un hash aleatorio para la operacion
}else{
ejecutarAccion(SecurityController.EjecucionTrasLogin.VER_PEDIDOS);
}
}
public void borrarPedido(){
if(context.getSecurityContext().isBorrarPedidos()){
RequestContext con = RequestContext.getCurrentInstance();
con.execute("PF('LoginDialog').show();");
accion = SecurityController.EjecucionTrasLogin.BORRAR_PEDIDOS;
//crear un hash aleatorio para la operacion
}else{
ejecutarAccion(SecurityController.EjecucionTrasLogin.BORRAR_PEDIDOS);
}
}
EjecucionTrasLogin是一个枚举类:
public enum EjecucionTrasLogin{
CREAR_ALBARANES,
EDITAR_ALBARANES,
VER_ALBARANES,
BORRAR_ALBARANES,
CREAR_CAJAS,
EDITAR_CAJAS,
VER_CAJAS,
BORRAR_CAJAS,
....
正如我所说的那样有效,但我确信这是更好的方法。对不起我的英文