[1227] | 1 | package gov.va.med.edp.springframework.security.userdetails.vistalink;
|
---|
| 2 |
|
---|
| 3 | import gov.va.med.edp.springframework.security.userdetails.VistaUserDetails;
|
---|
| 4 | import gov.va.med.edp.springframework.security.userdetails.VistaUserDetailsService;
|
---|
| 5 | import gov.va.med.edp.vistalink.ConnectionFactoryLocator;
|
---|
| 6 | import gov.va.med.edp.vistalink.VistaLinkDaoSupport;
|
---|
| 7 | import gov.va.med.edp.vistalink.VistaLinkTemplate;
|
---|
| 8 | import org.springframework.security.BadCredentialsException;
|
---|
| 9 | import org.springframework.security.GrantedAuthority;
|
---|
| 10 | import org.springframework.security.GrantedAuthorityImpl;
|
---|
| 11 | import org.springframework.dao.DataAccessException;
|
---|
| 12 | import org.springframework.util.StringUtils;
|
---|
| 13 | import org.springframework.util.Assert;
|
---|
| 14 |
|
---|
| 15 | import java.util.ArrayList;
|
---|
| 16 | import java.util.List;
|
---|
| 17 |
|
---|
| 18 | public class VistaLinkUserDetailService extends VistaLinkDaoSupport implements VistaUserDetailsService {
|
---|
| 19 |
|
---|
| 20 | static final int DEFAULT_TIMEOUT = 600;
|
---|
| 21 |
|
---|
| 22 | static final String RPC_CONTEXT = "XUS KAAJEE WEB LOGON";
|
---|
| 23 |
|
---|
| 24 | static final String GET_USER_INFO_RPC = "XUS KAAJEE GET USER INFO";
|
---|
| 25 | static final String LOGOUT_RPC_NAME = "XUS KAAJEE LOGOUT";
|
---|
| 26 |
|
---|
| 27 | private String applicationName;
|
---|
| 28 |
|
---|
| 29 | protected void checkDaoConfig() throws IllegalArgumentException {
|
---|
| 30 | Assert.hasText(applicationName, "''applicationName' must not be empty");
|
---|
| 31 | super.checkDaoConfig();
|
---|
| 32 | }
|
---|
| 33 |
|
---|
| 34 | protected VistaLinkTemplate createRpcTemplate(ConnectionFactoryLocator connectionFactoryLocator) {
|
---|
| 35 | VistaLinkTemplate template = super.createRpcTemplate(connectionFactoryLocator);
|
---|
| 36 | template.setTimeOut(DEFAULT_TIMEOUT);
|
---|
| 37 | return template;
|
---|
| 38 | }
|
---|
| 39 |
|
---|
| 40 | public VistaUserDetails login(String stationNumber, String accessCode, String verifyCode, String remoteAddress) throws BadCredentialsException, DataAccessException {
|
---|
| 41 | if (!StringUtils.hasLength(stationNumber)) throw new BadCredentialsException("missing station number");
|
---|
| 42 | if (!StringUtils.hasLength(accessCode)) throw new BadCredentialsException("missing access code");
|
---|
| 43 | if (!StringUtils.hasLength(verifyCode)) throw new BadCredentialsException("missing verify code");
|
---|
| 44 | if (!StringUtils.hasLength(remoteAddress)) throw new BadCredentialsException("missing remote address");
|
---|
| 45 | try {
|
---|
| 46 | String result = getRpcTemplate().rpc(new VistaLinkAccessVerifyConnectionSpec(stationNumber, accessCode, verifyCode, remoteAddress), stationNumber, null, RPC_CONTEXT, GET_USER_INFO_RPC, createLoginParams(remoteAddress));
|
---|
| 47 | return createVistaUserDetails(result, accessCode, verifyCode);
|
---|
| 48 | } catch (DataAccessException e) {
|
---|
| 49 | throw new BadCredentialsException("couldn't log in", e);
|
---|
| 50 | }
|
---|
| 51 | }
|
---|
| 52 |
|
---|
| 53 | public void logout(VistaUserDetails user) throws DataAccessException {
|
---|
| 54 | getRpcTemplate().rpcAsUser(user.getLoginStationNumber(), user.getDuz(), RPC_CONTEXT, LOGOUT_RPC_NAME, createLogoutParams(user));
|
---|
| 55 | }
|
---|
| 56 |
|
---|
| 57 | private List createLoginParams(String remoteAddress) {
|
---|
| 58 | List params = new ArrayList();
|
---|
| 59 | params.add(remoteAddress);
|
---|
| 60 | params.add(getApplicationName());
|
---|
| 61 | return params;
|
---|
| 62 | }
|
---|
| 63 |
|
---|
| 64 |
|
---|
| 65 | private List createLogoutParams(VistaUserDetails user) {
|
---|
| 66 | List params = new ArrayList();
|
---|
| 67 | params.add(user.getSignonLogInternalEntryNumber());
|
---|
| 68 | return params;
|
---|
| 69 | }
|
---|
| 70 |
|
---|
| 71 | /*
|
---|
| 72 | * Result(0) is the users DUZ.
|
---|
| 73 | * Result(1) is the user name from the .01 field.
|
---|
| 74 | * Result(2) is the users full name from the name standard file.
|
---|
| 75 | * Result(3) is the FAMILY (LAST) NAME (or ^ if null)
|
---|
| 76 | * Result(4) is the GIVEN (FIRST) NAME (or ^ if null)
|
---|
| 77 | * Result(5) is the MIDDLE NAME (or ^ if null)
|
---|
| 78 | * Result(6) is the PREFIX (or ^ if null)
|
---|
| 79 | * Result(7) is the SUFFIX (or ^ if null)
|
---|
| 80 | * Result(8) is the DEGREE (or ^ if null)
|
---|
| 81 | * Result(9) is station # of the division that the user is working in.
|
---|
| 82 | * Result(10) is the station # of the parent facility for the login division
|
---|
| 83 | * Result(11) is the station # of the computer system "parent" from the KSP file.
|
---|
| 84 | * Result(12) is the IEN of the signon log entry
|
---|
| 85 | * Result(13) = # of permissible divisions
|
---|
| 86 | * Result(14-n) are the permissible divisions for user login, in the format:
|
---|
| 87 | * IEN of file 4^Station Name^Station Number^default? (1 or 0)
|
---|
| 88 | */
|
---|
| 89 | protected VistaUserDetails createVistaUserDetails(String result, String accessCode, String verifyCode) {
|
---|
| 90 | String[] results = result.split("\n");
|
---|
| 91 | VistaUser u = new VistaUser(results[12],
|
---|
| 92 | results[9],
|
---|
| 93 | results[0],
|
---|
| 94 | accessCode,
|
---|
| 95 | verifyCode,
|
---|
| 96 | true,
|
---|
| 97 | true,
|
---|
| 98 | true,
|
---|
| 99 | true,
|
---|
| 100 | new GrantedAuthority[]{new GrantedAuthorityImpl("ROLE_USER")});
|
---|
| 101 | u.setPersonName(results[1]);
|
---|
| 102 | u.setDisplayName(results[2]);
|
---|
| 103 | u.setFamilyName(nullSafeGet(results[3]));
|
---|
| 104 | u.setGivenName(nullSafeGet(results[4]));
|
---|
| 105 | u.setMiddleName(nullSafeGet(results[5]));
|
---|
| 106 | u.setPrefix(nullSafeGet(results[6]));
|
---|
| 107 | u.setSuffix(nullSafeGet(results[7]));
|
---|
| 108 | u.setDegree(nullSafeGet(results[8]));
|
---|
| 109 | return u;
|
---|
| 110 | }
|
---|
| 111 |
|
---|
| 112 | private String nullSafeGet(String value) {
|
---|
| 113 | if (value.equals("^")) return null;
|
---|
| 114 | return value;
|
---|
| 115 | }
|
---|
| 116 |
|
---|
| 117 | public String getApplicationName() {
|
---|
| 118 | return applicationName;
|
---|
| 119 | }
|
---|
| 120 |
|
---|
| 121 | public void setApplicationName(String applicationName) {
|
---|
| 122 | this.applicationName = applicationName;
|
---|
| 123 | }
|
---|
| 124 | }
|
---|