2015-01-18 1 views
3

Я занимаюсь разработкой веб-приложение, которое имеет следующие требования:магазин дополнительная информация после аутентификации [Весна]

  1. позволяют пользователю войти в систему
  2. На стороне сервера аутентификации пользователя с помощью 3 участника Веб-сервис REST.
  3. Веб-служба REST вернет уникальный токен и ключ, если аутентификация прошла успешно.
  4. Любые последующие запросы к веб-службе REST должны содержать токен, полученный в пункте 3 (см. Выше).

Я использую функцию весны-mvc и пружину для веб-приложения. Итак, у меня есть решение, но я новичок в весне и не уверен, правильно ли решение.

Может кто-то пожалуйста, сообщите, если:

  1. Является ли решение правильно реализовать?
  2. Является ли решение воздействием на производительность каким-либо образом?
  3. Получает ли решение любые защитные отверстия?

Спасибо :)


Решение:

  1. Я создал объект MyUser, который будет хранить дополнительную информацию, полученную от службы REST.

    public class MyUser implements Serializable { 
    
        private static final long serialVersionUID = 5047510412099091708L; 
        private String RestToken; 
        private String RestKey; 
    
        public String getRestToken() { 
         return RestToken; 
        } 
        public void setRestToken(String restToken) { 
         RestToken = restToken; 
        } 
        public String getRestKey() { 
         return RestKey; 
        } 
        public void setRestKey(String restKey) { 
         RestKey = restKey; 
        } 
    } 
    
  2. Затем я создал MyAuthenticationToken объект, который расширяет UsernamePasswordAuthenticationToken. Этот объект будет использоваться в CustomAuthenticationProvider (пункт 3 ниже).

    public class MyAuthenticationToken extends UsernamePasswordAuthenticationToken { 
    
         private static final long serialVersionUID = 7425814465946838862L; 
         private MyUser myUser; 
    
         public MyAuthenticationToken(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities, MyUser myUser){ 
    
          super(principal, credentials, authorities); 
          this.myUser = myUser; 
         } 
    
         public MyUser getMyUser() { 
          return myUser; 
         } 
    
         public void setMyUser(MyUser myUser) { 
          this.myUser = myUser; 
         } 
        } 
    
  3. Я создал настраиваемый поставщик проверки подлинности, который будет вызывать службу REST для проверки подлинности, а затем хранить дополнительную информацию в MyUser и myAuthenticationToken объектов.

    public class CustomAuthenticationProvider implements AuthenticationProvider { 
    
         @Override 
         public Authentication authenticate (Authentication authentication) { 
    
          MyUser myUser = new MyUser(); 
          MyAuthenticationToken authenticationToken = null; 
          String name = authentication.getName(); 
          String password = authentication.getCredentials().toString(); 
    
          //Just an example. This section will connect to a web service in order to authenticate the client 
          if (name.equals("justh") && password.equals("123456")) { 
    
           //Set the Token and Key Received from the REST WebService 
           myUser.setRestKey("RestKey"); 
           myUser.setRestToken("RestToken"); 
    
           List<GrantedAuthority> grantedAuths = new ArrayList<GrantedAuthority>(); 
           grantedAuths.add(new SimpleGrantedAuthority("ROLE_USER")); 
    
           authenticationToken = new MyAuthenticationToken(name, password, grantedAuths, myUser); 
    
           return authenticationToken; 
          } else { 
           return null; 
          } 
         } 
    
  4. Наконец, я могу получить доступ к данным, хранящимся в мой контроллер

    public ModelAndView adminPage(Authentication authentication) { 
    
         MyUser user = null; 
         //Get the additional data stored 
         if(authentication instanceof MyAuthenticationToken){ 
          user = ((MyAuthenticationToken)authentication).getMyUser(); 
         } 
    
         ModelAndView model = new ModelAndView(); 
         model.addObject("title", "Spring Security Hello World"); 
         model.addObject("message", "This is protected page - Admin Page!" + authentication.getName() + user.getRestKey() + user.getRestToken()); 
         model.setViewName("admin"); 
         return model; 
        } 
    

ответ

1

Ваш подход является правильным. Вы должны реализовать пользовательские значения AuthenticationManager и Authentication, когда ваши требования превышают простой поток аутентификации пароля пользователя.

Но не забудьте выполнить договор с интерфейсом AuthenticationManager.

Я сделал что-то очень похожее в моем webmailer для аутентификации на сервере smtp/imap с javax.mail, и он работает безупречно.

+0

Прохладный - спасибо за ввод. Посмотрите также на свой код. – JustH