2014-04-15 4 views
6

Я знаю, это кажется странным требованием, но когда клиент хочет, это означает, что у нас нет другого выбора. Я работаю над веб-приложением (электронной коммерцией) и должен зарегистрировать нового клиента, до сих пор все работает отлично. Однако существует требование со следующих случаяхДоступ только для чтения для зарегистрированных пользователей | Spring-MVC

  1. Если регистр клиентов с определенным идентификатором электронной почты они будут приняты немедленно и будет разрешено просматривать, видеть все, и им будет разрешено совершать какие-либо сделки.
  2. Для другого набора клиентов им разрешено войти в систему, но у них есть доступ только для чтения к этому разделу профиля, а также не может видеть цены (дисконтированные) для продуктов, а также не разрешено делать какие-либо транзакции.

Поскольку эти варианты использования не применяются к определенной категории, но для всего веб-приложения, я не уверен, как наилучшим образом мы можем достичь этого. Мало вариантов, приезжающих на мой взгляд

  1. Добавить новую роль под яровой безопасностью, а также для тех, кто доступ только для чтения должны иметь эту новую роль.
  2. создать какой-то HandlerInterceptor, который будет проверять роль клиента перед выполнением фактического запроса.

Но не уверен, если я имею в виду, в правильном направлении и как именно мы должны обеспечить соблюдение доступа только для чтения к такому типу customers.Since Мы должны остановить такой клиент от

  1. Update его/ее профиль
  2. Обновить пароль.
  3. Любая другая Updation там профиль
  4. не позволяет клиенту оформить
  5. Фактических дисконтные цены не должны быть видны

ответ

3

Лучшим подходом является использование простого механизма контроля доступа на основе ролей (RBAC). Это хорошо поддерживается Spring Security и прост в использовании.

Вы должны создать новую роль (например, «FULL_ACCESS») и назначить ее правильным пользователям на основе их адреса электронной почты. Роль должна охватывать пользователей с полным доступом, а не правами, доступными только для чтения, по вашему запросу.

Обычно вы определяете роли текущего пользователя в реализации UserDetailsService. Вы можете использовать org.springframework.security.core.authority.SimpleGrantedAuthority как свою реализацию GrantedAuthority (в вашем контексте GrantedAuthority - это то же самое, что и роль). Предоставленные из вашего UserDetailsService средства GrantedAuthorities хранятся внутри объекта Authentication вашего пользователя и доступны в течение всей сессии пользователя.

Этот подход также позволяет легко изменить пользователя из режима только для чтения в полноэкранный режим (например, после утверждения регистрации), добавив роль «FULL_ACCESS» во время следующего входа пользователя после утверждения.

После того, как вы заполнили свои GrantedAuthorities, вы можете использовать как декларативные, так и программные средства авторизации. Для программной авторизации (авторизации выполняется непосредственно в коде) использовать например .:

if (request.isUserInRole("FULL_ACCESS")) { 
     // Only for users with full acccess 
} 

Для декларативной авторизации (авторизации объявленным в файлах конфигурации или в качестве аннотации к коду), вы можете использовать securing of method calls with aspects or annotations.

Вы также можете декларативно защищать URL-адреса, используя expression-based access control, но более подходящими являются два предыдущих подхода. Один и тот же URL-адрес может быть доступен пользователям с полными и доступными только для чтения правами доступа, что затрудняет использование этого метода для вашего прецедента.

Spring Security также предоставляет набор aurhorization JSP tags, который может помочь вам правильно отобразить пользовательский интерфейс для пользователей разных типов.

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

2

Мне нравится spring-security's expression-based access control для аннотирования методов контроллера с разрешенными ролями, но вы можете использовать URL-адрес перехватчик вместо этого, если ваши действия легко отделяются URL-адресом и/или HTTP-глаголом. Любое решение должно помешать им выполнять любые действия, которые они не должны делать.

Затем вы можете ограничить данные и/или ссылки, которые пользователь может видеть просто, указав другое представление, если им не хватает определенной роли (или с помощью spring security authorize tag в том же представлении).

+0

Поблагодарили за вход .... Я знаю об авторизованном теге .. но мне нужно показать ссылки/раздел всем клиентам только с клиентом, доступ к которому доступен только для чтения. –

2

Я бы начал создавать новые роли и использовал spring-security's expression based access control, как это предложил @ peter-g.

Если ваша электронная коммерция является традиционным веб-приложением (страницы, обработанные сервером), фильтрация URL-адресов - не лучший подход. В этом случае я бы объединил:

  1. Оценка уровня метода в сервисном слое. Только @PreAuthorize аннотации, помещенные во входной вызов для bean-компонента, будут полезны. Если вы вызываете myService.methodA(), и этот метод вызывает аннотированный метод this.methodB() (это myService()), аннотации безопасности не будут работать. Они будут работать только при первом вызове myService (в этом случае помещается на methodA()). Это служит брандмауэром безопасности для вашей бизнес-логики.
  2. Фильтрация ссылок/данных на странице рендеринга на основе ролей. На ваших JSP отфильтровывайте содержимое и ссылки (которые фактически являются действиями), которые не соответствуют текущим активным ролям. Это имеет две цели. Один, чтобы показать конкретный контент для определенных ролей. Во-вторых, это первый барьер безопасности, который позволяет избежать доступа пользователя к вашей бизнес-логике. Вы даже не показываете им, что для них доступно определенное действие.

Учитывая это, пользователь никогда не сможет нажать любую кнопку/ссылку для доступа к защищенному ресурсу. В случае, если вы пропустите ни одного, аннотации уровня обслуживания будут действовать как последний брандмауэр, защищающий выполнение привилегированных действий. Так же, как вы отфильтровываете гипермедиа/данные, вы можете фильтровать цены.

Если ваш бэкэнд является веб-API, вы можете использовать фильтрацию URL-адресов с аннотациями или конфигурацией XML/Java и фильтровать вывод, используя представления Jackson (если вы используете JSON) или XSLT, если используете XML. Это позволяет осуществлять более тонкий контроль и более сплоченную реализацию безопасности.

Смежные вопросы