Websphere 9 форма входа в систему - PullRequest
0 голосов
/ 14 октября 2019

Я новичок в WebSphere 9 и пытаюсь настроить вход в систему для приложения JAAS.

Я установил флажок «включить защиту приложения» и закодировал пользовательский LoginModule.

Я настроил свой модуль в разделе «Безопасность» -> «Глобальная безопасность» -> «Вход в приложение» следующим образом:

  • Я выбрал псевдоним «myAlias» (который я буду использовать позже в LoginContext)
  • Я указал имя класса моего модуля (включенный прокси-модуль и выбран как обязательный)
  • Я настроил некоторые пользовательские свойства

Затем я настроил свой web.xml, чтобы некоторые из веб-страницзащищены, и я определил страницы входа и ошибки.

Моя форма входа в систему отправляет имя пользователя и пароль контроллеру, который выполняет следующий код:

WSCallbackHandlerImpl callbackHandler = new WSCallbackHandlerImpl(username, password);

LoginContext lc = new LoginContext("myAlias", callbackHandler);
lc.login();
Subject s = lc.getSubject();
WSSubject.setRunAsSubject(s);

Пока все хорошо. Когда я пытаюсь получить доступ к защищенной странице, мой браузер перенаправляет на страницу входа. Я отправляю своего пользователя / пароль на мой контроллер, и он выполняет lc.login (), поэтому вызывается мой пользовательский LoginModule, и аутентификация проходит нормально. Но затем контроллер отправляет перенаправление на защищенную страницу, контейнер, похоже, не знает об аутентификации и снова возвращает меня на страницу входа. Кроме того, если я попробую это:

@Resource
private SessionContext sessionContext;

....
Principal principal = sessionContext.getCallerPrincipal();

Мой принципал: UNAUTHENTICATED

Это мой web.xml

    <security-constraint>
        <display-name>User Pages</display-name>
        <web-resource-collection>
            <web-resource-name>Protected</web-resource-name>
            <url-pattern>/protected/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
            <http-method>HEAD</http-method>
            <http-method>PUT</http-method>
            <http-method>OPTIONS</http-method>
            <http-method>TRACE</http-method>
            <http-method>DELETE</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>ADMINISTRATOR</role-name>
        </auth-constraint>
    </security-constraint>
    <login-config>
        <auth-method>FORM</auth-method>
        <form-login-config>
            <form-login-page>/public/login.xhtml</form-login-page>
            <form-error-page>/public/login.xhtml</form-error-page>
        </form-login-config>
    </login-config>
    <security-role>
        <role-name>ADMINISTRATOR</role-name>
    </security-role>

И это мой модуль входа в систему:


    Subject loginSubject;
    CallbackHandler loginCallbackHandler;
    private String username;
    private List<String> rolenames;
    private boolean succeeded = false;
    private boolean commitSucceeded = false;

    @Override
    public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState,
            Map<String, ?> options) {

        this.loginSubject = subject;
        this.loginCallbackHandler = callbackHandler;

    }

    @Override
    public boolean login() throws LoginException {

        Callback[] callbacks = new Callback[2];
        callbacks[0] = new NameCallback("username");
        callbacks[1] = new PasswordCallback("password", false);

        try {
            loginCallbackHandler.handle(callbacks);
        } catch (IOException | UnsupportedCallbackException e) {
            throw new LoginException();
        }

        String name = ((NameCallback) callbacks[0]).getName();
        String pass = String.valueOf(((PasswordCallback) callbacks[1]).getPassword());

        succeeded = check (name, pass);

        if (succeeded) {
            username = name;
            rolenames = setUpRoles(name);
        }

        return true;

    }

    @Override
    public boolean commit() throws LoginException {

        if (!succeeded)
            return false;

        try {

            MyPrincipal user = new MyPrincipal(username);
            loginSubject.getPrincipals().add(user);

            for (String rolename : rolenames) {

                MyRole role = new MyRole(rolename);
                loginSubject.getPrincipals().add(role);
            }

            username = null;
            rolenames = null;

            commitSucceeded = true;

            return true;

        } catch (Exception e) {

            throw new LoginException(e.getMessage());
        }
    }

Я что-то упустил? У меня есть некоторые сомнения:

  • Можно / нужно ли использовать request.login () в моем контроллере, как я использовал на других серверах?
  • Нужно ли использовать системный логин иизменить / клонировать WEB_INBOUND?
  • Нужно ли настраивать какое-либо отображение пользователя / роли?

Заранее спасибо

...