在管理员可以配置操作之前重新验证用户身份

时间:2015-04-02 14:56:16

标签: java spring jsf primefaces

我正在使用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,
 ....

正如我所说的那样有效,但我确信这是更好的方法。对不起我的英文

0 个答案:

没有答案