tomcat jaas - How to perform authoraisation with the following

Viewed 19

so am studying jaas and performed authentication with it i need to perform authoraisation like allowing only a specified group of people and for my application there are only two gropups admin and users so how can i add authoraisation using the principle class.. action for users(action2,logout) action available for admin(action1,action2,logout) So my driver file is

public class Driver {
    public  enum Action{action1,action2,logout};
    public static void main(String[] args) {
        Driver driver = new Driver();
        System.setProperty("java.security.auth.login.config", "Lord.config");
        LoginContext loginContext = null;
        while(true){
        try{    
            loginContext = new LoginContext("LorduJaas",new LoCallbackHandler());
            loginContext.login();
            boolean flag = true;;
            while (flag) flag = driver.performAction(loginContext);
        }catch  (LoginException  | IOException e){
            System.out.println(e);
        }
    }
}
    boolean performAction(LoginContext loginContext)throws IOException,LoginException{
        
        boolean flag = true;
        System.out.println("Please specify your action (Usage: action1,action2,logout)");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        try{
        switch(Action.valueOf(br.readLine()))
        {
            case logout:
                loginContext.logout();
                System.out.println("logged out");
                flag = false;
                break;
            case action1: 
                PrivilegedAction<Object> privilegedAction1 = () -> {
                    System.out.println("Action 1 done..");
                    return null;
                };
                Subject.doAs(loginContext.getSubject(),privilegedAction1);
                System.out.println("by " + loginContext.getSubject().getPrincipals().iterator().next().getName());
                break;
            case action2 : 
                PrivilegedAction<Object> privilegedAction2 = () -> {
                System.out.println("Action 2 done..");
                return null;
            };
            Subject.doAs(loginContext.getSubject(), privilegedAction2);
            System.out.println(" by " +loginContext.getSubject().getPrincipals().iterator().next().getName());
            break;    
        }
        
    }catch(IllegalArgumentException ex){
        System.out.println(ex);
    }
    return flag;
    }
}

My callback file

public class LorduCallback implements CallbackHandler{
    private String user = null;
    private String mobile = null;
    public LorduCallback(String user, String mobile){
        this.user = user;
        this.mobile = mobile;
    }
    public void handle(Callback[] callbackArray) throws IOException,UnsupportedCallbackException{
        int counter = 0;
        while(counter < callbackArray.length){
            if(callbackArray[counter] instanceof NameCallback){
                NameCallback nameCallback = (NameCallback) callbackArray[counter++];
                nameCallback.setName(user);
            }else if (callbackArray[counter] instanceof PasswordCallback){
                PasswordCallback passwordCallback = (PasswordCallback) callbackArray[counter++];
                passwordCallback.setPassword(mobile.toCharArray());
            }
        }
    }
}

my login context file

public class LoLoginModule implements LoginModule{
        public static final String[][] TEST_USERS  = {{"admin","password"},{"admin2","password2"}};
        private Subject subject  = null;
        private CallbackHandler callbackHandler = null;
        private LorduPrinciple lorduPrinciple = null;
        public void  initialize(Subject subject, CallbackHandler  callbackHandler, Map<String, ?> arg2, Map<String, ?> arg3)
        {
            this.subject = subject;
            this.callbackHandler = callbackHandler;
        System.out.println("Lordu login module initiallised....");
        }
    
    public boolean login()  throws LoginException{
        boolean flag = false;
        System.out.println("Login...");
        Callback[] callbackArray = new Callback[2];
        callbackArray[0] = new NameCallback("User Name :");
        callbackArray[1] = new PasswordCallback("Password: ", false);
       try{
        callbackHandler.handle(callbackArray);
        String name = ((NameCallback) callbackArray[0]).getName();
        String password = new String (((PasswordCallback) callbackArray[1]).getPassword());
        int i =0;
        while(i<TEST_USERS.length){
            if(TEST_USERS[i][0].equals(name) && TEST_USERS[i][1].equals(password)){
                lorduPrinciple = new LorduPrinciple(name);
                System.out.println("Authentication Success");
                flag = true;
                break;
            }
            i++; 
        }
        if(flag==false) throw new FailedLoginException("authentication failure...");
        }catch (Exception e){
           System.out.println(e);
       }
        return flag; 
    }

    public boolean commit() throws LoginException{
        boolean flag = false;
        System.out.println("Commit...");
        if(subject != null && !subject.getPrincipals().contains(lorduPrinciple)){
            subject.getPrincipals().add(lorduPrinciple);
            flag = true;
        }
        return flag;
    }
    public boolean abort () throws LoginException{
        
        System.out.println("Abort module implementing...");
        if(subject != null && lorduPrinciple != null && subject.getPrincipals().contains(lorduPrinciple)){
            subject.getPrincipals().remove(lorduPrinciple);
        }
        subject = null;
        lorduPrinciple = null;
        return true;
    }
    

    
    public boolean logout() throws LoginException{
        
        System.out.println("Logout module implementing....");
        subject.getPrincipals().remove(lorduPrinciple);
        subject = null;
        return true; 
    }
}

my principle file

public class LorduPrinciple implements Principal, Serializable{
    private static final long seriallVersionUID =1L;
    private final String name;
    public LorduPrinciple(String name){
        this.name = name;
    }

    public String getName(){
        System.out.println("LorduPrinciple.getName...");
        return name;
    }
    public boolean equals(Object object){
        System.out.println(
            "checking name and principle name"
        );
        boolean flag = false;
        if(object instanceof LorduPrinciple) {flag = name.equals(((LorduPrinciple) object).getName());}
        return flag;
    }
}
0 Answers
Related