Я пытаюсь реализовать сценарий предварительной аутентификации, и у меня возникают несколько проблем ... Это мой файл контекста безопасности.
<sec:global-method-security secured-annotations="enabled" pre-post-annotations="disabled"/>
<sec:http pattern="/static/**" security="none" />
<bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<property name="preAuthenticatedUserDetailsService">
<bean id="userDetailsServiceWrapper"
class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
<property name="userDetailsService" ref="userDetailsService"/>
</bean>
</property>
</bean>
<bean id="userDetailsService"
class="com.myapp.UserDetailsServiceImpl"/>
<sec:authentication-manager alias="authenticationManager">
<sec:authentication-provider ref="preauthAuthProvider" />
</sec:authentication-manager>
<sec:http auto-config="false" use-expressions="true">
<sec:intercept-url pattern="/index.htm" access="permitAll"/>
<sec:intercept-url pattern="/logoff.html" access="permitAll"/>
<sec:intercept-url pattern="/profile/**" access="hasAnyRole('ROLE_PROFILEUSER', 'ROLE_ADMIN')"/>
<sec:intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')"/>
<sec:intercept-url pattern="/**" access="isAuthenticated()"/>
<!-- <sec:form-login login-page="/login.html" default-target-url="/home.html" authentication-failure-url="/login.html"/> -->
<sec:logout logout-url="/logoff.html"/>
<sec:custom-filter position="PRE_AUTH_FILTER" ref="channelSecureFilter" />
</sec:http>
<bean id="channelSecureFilter"
class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter">
<property name="principalRequestHeader" value="SM_UNIVERSAL_ID"/>
<property name="authenticationManager" ref="authenticationManager"/>
<property name="invalidateSessionOnPrincipalChange" value="true"/>
</bean>
<bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
<property name="decisionVoters">
<list>
<ref local="roleVoter"/>
<ref local="authenticatedVoter"/>
</list>
</property>
</bean>
<bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter">
<property name="rolePrefix" value="ROLE_"/>
</bean>
<bean id="authenticatedVoter" class="org.springframework.security.access.vote.AuthenticatedVoter"/>
, и это пользовательский UserDetailsServiceImpl
@Component
public class UserDetailsServiceImpl extends PreAuthenticatedGrantedAuthoritiesUserDetailsService implements UserDetailsService{
@Autowired PersonService personService;
@Override
public UserDetails loadUserByUsername(String arg0) throws UsernameNotFoundException {
//I dont think anything is needed here... right?
return null;
}
@Override
protected UserDetails createuserDetails(Authentication token,
Collection<? extends GrantedAuthority> role){
Person lp = PersonService.findPersonByNetId(token.getName());
PreAuthenticatedGrantedAuthoritiesUserDetailsService test = new PreAuthenticatedGrantedAuthoritiesUserDetailsService();
if(lp==null){
role.add(new SimpleGrantedAuthority("ROLE_USER"));
return new LLUser(token.getName(),"N/A", true, true, true, true, role, null);
}
else{
boolean enabled = (lp.getIsActive()==1)?true:false;
boolean credentialsNonExpired = (lp.getIsActive()==1)?true:false;
//test whehther deactivate date is null or deactivate data is greater than current date
boolean accountNonExpired = ((lp.getDeactivateDate()==null)||(lp.getDeactivateDate().compareTo(new Date())>0))?true:false;
boolean accountNonLocked = (lp.getIsActive()==1)?true:false;
Integer personId = lp.getPerson().getId();
if(lp.getLlRole()!=null){
if(lp.getLlRole()==10)
{
role.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
role.add(new SimpleGrantedAuthority("ROLE_PROFILEUSER"));
}
if(lp.getLlRole()==25)
role.add(new SimpleGrantedAuthority("ROLE_PROFILEUSER"));
}
role.add(new SimpleGrantedAuthority("ROLE_USER"));
return new LLUser(token.getName(),"N/A", enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, role, personId);
}
}
}
LLUser - это пользовательский объект пользователя, который расширяет пользовательский объект Spring.Итак, теперь проблемы,
1).Я не могу добавить SimpleGrantedauthoriy в коллекцию "role".Я получаю следующую ошибку и не могу ее понять, потому что SimplegGrantedAuthority является реализацией GrantedAuthority, верно?
the method add(capture#1-of ? extends GrantedAuthority) in the type collection<capture#1-of ? extends GrantedAuthority> is not applicable for the arguments (SimpleGrantedAuthority)
2).Я очень уверен, что мой способ инициализации пользовательского объекта User неверен, потому что пароль не приходит из запроса, и класс User не будет знать, с чем сравнивать?
Также, пожалуйста, посмотрите на мой конфигурационный файл контекста.и дайте мне знать, если есть какие-либо избыточные элементы или я что-то упустил.Заранее спасибо.