Могу ли я нажать на свой собственный объект пользователя в Security SecurityContext? -- java поле с участием spring поле с участием spring-security пол Связанный проблема

Can I push my own User object into Spring's SecurityContext?


1
vote

проблема

русский

Я новичок в весенней безопасности и последовал за некоторыми основными рецептами, чтобы получить весеннюю безопасность, работающую в моем заявлении, но теперь я пытаюсь увидеть, есть ли способ получить свой собственный объект пользователя, добавленный к Security Security Contactex / аутентификация.

Моя безопасность в настоящее время настроена на использование JDBCDAOIMPL:

 <код> <authentication-manager alias="authenticationManager">     <authentication-provider user-service-ref="com.ia.security.SpringSecurityDao" /> </authentication-manager>  <beans:bean id="com.ia.security.SpringSecurityDao" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">     <beans:property name="usersByUsernameQuery">         <beans:value>select username,password,enabled          from user          where username = ?         </beans:value>     </beans:property>     <beans:property name="dataSource" ref="dataSource" />     <beans:property name="enableGroups" value="true" />     <beans:property name="enableAuthorities" value="false" />     <beans:property name="groupAuthoritiesByUsernameQuery">         <beans:value>SELECT R.ID, R.NAME, P.NAME             FROM ROLE R             JOIN USER_ROLE UR on R.id = UR.role_id             JOIN USER U on U.id = UR.user_id             JOIN ROLE_PERMISSION RP ON RP.role_id = R.id             JOIN PERMISSION P ON P.id = RP.permission_id             WHERE U.username=?         </beans:value>     </beans:property> </beans:bean>   

Я понимаю, что могу получить объект Principal из SecurityContext и получить имя пользователя и requary DB с учетом имени пользователя, но думал, что было бы проще простым хранилищами весь мой <код> User Объект в SecurityContext, чтобы он легко доступен, когда мне нужно все в моем приложении, в отличие от того, что просто сохранение имени пользователя, пароля и включенных полей в UserDetails объекта.

Я посмотрел в userdetailsservice, а более конкретно <код> JdbcDaoImpl класс, но не совсем уверен в лучшем способе продолжить. Если я просто переопределите / продлись, вызывая <код> super.loadUserByUsername <код> loadUserByUsername метод для возврата моих собственных объектов userdetails - это то, что достаточно? Тогда бы я просто смогу сделать <код> SecurityContextHolder.getContext().getAuthentication().getDetails() и бросить его на свой собственный объект?

Я нашел другие посты на Stackoverflow, который относится к этому, но большинство, похоже, игнорируют что-либо связанные с властями и ролями, которые извлекаются из БД, поэтому я не уверен, что это лучший способ продолжить ,

Английский оригинал

I'm new to Spring Security and have followed some basic recipes to get Spring Security working in my application, but now I'm trying to see if there is a way to get my own User object added to Spring's SecurityContext upon login/authentication.

My security is currently configured to use the JdbcDaoImpl:

<authentication-manager alias="authenticationManager">     <authentication-provider user-service-ref="com.ia.security.SpringSecurityDao" /> </authentication-manager>  <beans:bean id="com.ia.security.SpringSecurityDao" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">     <beans:property name="usersByUsernameQuery">         <beans:value>select username,password,enabled          from user          where username = ?         </beans:value>     </beans:property>     <beans:property name="dataSource" ref="dataSource" />     <beans:property name="enableGroups" value="true" />     <beans:property name="enableAuthorities" value="false" />     <beans:property name="groupAuthoritiesByUsernameQuery">         <beans:value>SELECT R.ID, R.NAME, P.NAME             FROM ROLE R             JOIN USER_ROLE UR on R.id = UR.role_id             JOIN USER U on U.id = UR.user_id             JOIN ROLE_PERMISSION RP ON RP.role_id = R.id             JOIN PERMISSION P ON P.id = RP.permission_id             WHERE U.username=?         </beans:value>     </beans:property> </beans:bean> 

I realize that I can retrieve the Principal object from the SecurityContext and get the username and requery the DB given the username, but was thinking it would be easier to simple store the my entire User object in the SecurityContext to have it easily accessible whenever I need it throughout my application as opposed to just storing the username, password and enabled fields in the UserDetails object.

I've looked into the UserDetailsService, and more specifically the JdbcDaoImpl class, but not entirely sure of the best way to proceed. If I simply override/extend by calling super.loadUserByUsername the loadUserByUsername method to return my own UserDetails object is that sufficient? Then would I just be able to do SecurityContextHolder.getContext().getAuthentication().getDetails() and cast it to my own object?

I've found other posts on StackOverflow that relate to this, but most seem to be ignoring anything to do with Authorities and Roles that are retrieved from the DB, so I'm not sure if this is the best way to proceed.

</div
        

Список ответов

2
 
vote
vote
Лучший ответ
 

Краткий ответ: Да, вы можете сделать именно так, как вы планировали. Имейте в виду, что некоторые функциональные возможности, такие как «Hasrole», проверяет список властей, а не детали пользователя по умолчанию.

Долгий ответ: Сохранение объекта пользователя в SecurityContext, который проводится на сеансе, может иметь некоторые побочные эффекты. Это особенно верно, когда вы используете Hibernate. Ленивые исключения кого-нибудь? ;) Мы пошли на этот маршрут сначала и несколько звонков позже некоторые ложь, что было довольно сложно следить. Используя фильтр OpenSessionInview, мы подумали, что мы в безопасности, но это просто неправильно, как в следующем запросе, сессия ушла. Таким образом, мы загрузили более связанные объекты от пользователя, и это все еще есть. Сразу позже :)

У нас было три варианта. Либо объединить объект пользователя при каждом запросе, создайте POJO, удерживающуюся только необходимую информацию о безопасности в пользовательских задачах, или просто держите принцип (вход в систему) в контексте безопасности и загрузить объект пользователя после необходимости.

Мы пошли с третьему решению, так как Hibernate делает хорошую работу, используя кэш второго уровня. В качестве побочного эффекта, безопасность теперь более надежна, так как Spring Security получит сейчас последнюю версию пользователя по каждому запросу и не работает с «stale» ролями пользователя.

Так что, если вы не используете Hibernate, или вы можете гарантировать, что ни одна ложь не произойдет для решения одного или двух. Иначе я бы порекомендовал наш подход.

 

The short answer: Yes you can do exactly as you planned. Keep in mind that some functionality like "hasRole" checks the authorities list and not the user details by default.

The long answer: Keeping a user object in the securitycontext, which is held in the session can have some side effects. This is particularly true when you are using hibernate. Lazy exceptions anyone? ;) We went this route first and several calls later some LIEs happend which was quite tricky to follow up. Using the OpenSessionInView filter, we thought we are safe, but that's just wrong as in the next request the session is gone. So we loaded more related objects from the user and it still happend. Just later :)

We had three options. Either merge the user object on each request, create a pojo holding just the neccessary security information in the userdetails, or just keep the principal (login) in the security context and load the user object once it's needed.

We went with the third solution as hibernate does a good job using the second level cache. As a side effect the security is now more reliable as spring security gets now the latest version of a user on each request and does not work with "stale" user roles.

So if you dont use hibernate or you can guarantee that no LIEs will happen go for solution one or two. Else i would recommend our approach.

</div
 
 
       
       

Связанный проблема

1  Улучшение моего жадного алгоритма  ( Improving my greedy algorithm ) 
** Это мой код, который выглядит способ найти сумму в массиве ** <код> public class Piecedemonei { public static void recherche(int[] tab) { ...

12  Способ вызова в EJB на jboss запустить [дубликат]  ( Call method in ejb on jboss startup ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

-2  В классе F250.java есть две петли, которые не будут работать  ( There are two loops in the f250 java class that wont run ) 
Класс F250.java - это объект оружия, и есть два метода, которые привлекают и обновляют пули, выходящие из пистолета. Я сделал класс пули и сделал массив пули ...

1  Как увеличить предел параллельного соединения OpenFire?  ( How to increase openfire concurrent connection limit ) 
Я пытаюсь проверить, сколько одновременных пользовательских подключений Openfire может обрабатывать. Я заметил предел при 4000 пользователями. Как я могу ...

0  Общее утверждение для ошибки recuralandom return - Java  ( General statement for securerandom return error java ) 
Я искал на протяжении разных форумов, и теперь я наконец-то ставит свой вопрос, так как я не могу найти конкретный ответ. Я пишу протокол безопасности для д...

0  Java нерешенная переменная JPanel?  ( Java unresolved jpanel variable ) 
Почему не может <код> aniPanel быть разрешена в переменной. Я пробовал <код> AniPanel aniPanel = new AniPanel(); Но это не решает проблему. Я также по...

1  Простое Javaee HTML Get / Post Application  ( Simple javaee html get post application ) 
Я просто начинаю с Javaee (я вполне свободно владею в Javase), и у меня возникли проблемы с обездованием моего мозга вокруг всех новых вещей, которые необходи...

0  Строка заменить приключение в Java  ( String replace adventure in java ) 
Я пытаюсь добиться этого - если строка содержит шаблон <код> %25 с последующим любое количество альфа-цифровых символов, то мне нужно заменить <код> %25 с <...

0  ConstanaintValidator - сделать JPA сделать проверку после ввода  ( Constraintvalidator make jpa make the validation after input ) 
Можно ли сделать JPA проверить вход сразу после типов пользователей в чем-либо? Я использую EclipseLink. Я не хочу ждать, пока JPA сохраняется для проверк...

4  Как полностью квалифицировать класс, имя пакета которого сталкивается с местным именем члена?  ( How to fully qualify a class whose package name collides with a local member nam ) 
ОК, вот очень любопытная языковая головоломка Java 7 для специалистов JLS там. Следующий кусок кода не скомпилируется, ни с Javac, ни с Eclipse: <код> ...

1  WebView loaddatawithbaseurl java.lang.nullpointerexception  ( Webview loaddatawithbaseurl java lang nullpointerexception ) 
<код> //. . . public class MainActivity extends Activity { //. . . @Override protected void onCreate( Bundle savedInstanceState ) { //....

56  Когда использовать явное ожидание против неявного ожидания в Webdriver Selenium?  ( When to use explicit wait vs implicit wait in selenium webdriver ) 
Я использую: <код> driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS); Но он все еще непрерывно не работает для нижеизведанного элемента ...

1  Кварц Schdeuler для нескольких проектов в JBOSS 5  ( Quartz schdeuler for multiple projects in jboss 5 ) 
Я развернул два проекта (P1 & AMP; P2) в JBOSS 5. Оба проекта настроены с различными кварцевыми планировщиками. Но когда я заплатурую работу на P1, он доступа...

0  Чехол для тестирования, где нуль должен быть возвращен с помощью RestController с Mockito Change  ( Testing case where null should be returned using restcontroller with mockito fai ) 
Я хочу проверить корпус NullPointexception, который следует бросить контроллер, который я проверяю, но я всегда получаю ошибку NullPointexception. Я пытаюсь п...

1  Обратитесь к веб-странице внутри файла JAR  ( Refer to a web page inside a jar file ) 
У меня есть рабочий проект. Он включает в себя другой проект, который имеет дело с отдыхом как REST-API.jar. Теперь я сделал одностраничное интернет-интерфе...

Связанный проблема

1  Улучшение моего жадного алгоритма 
12  Способ вызова в EJB на jboss запустить [дубликат] 
-2  В классе F250.java есть две петли, которые не будут работать 
1  Как увеличить предел параллельного соединения OpenFire? 
0  Общее утверждение для ошибки recuralandom return - Java 
0  Java нерешенная переменная JPanel? 
1  Простое Javaee HTML Get / Post Application 
0  Строка заменить приключение в Java 
0  ConstanaintValidator - сделать JPA сделать проверку после ввода 
4  Как полностью квалифицировать класс, имя пакета которого сталкивается с местным именем члена? 
1  WebView loaddatawithbaseurl java.lang.nullpointerexception 
56  Когда использовать явное ожидание против неявного ожидания в Webdriver Selenium? 
1  Кварц Schdeuler для нескольких проектов в JBOSS 5 
0  Чехол для тестирования, где нуль должен быть возвращен с помощью RestController с Mockito Change 
1  Обратитесь к веб-странице внутри файла JAR 



© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.