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;
}
}