1

初めに!私の質問を読んでくれてありがとう。

すべての主要オブジェクトの取得に問題があります。Spring バージョン 3.2.1.RELEASE と spring security 3.1.3.RELEASE を使用しています。

私はネットで調査を行い、プリンシパルを取得する方法を見つけましたが、独自の認証コードを挿入した後は機能しなくなりました。すべてのプリンシパル オブジェクトを取得する方法:

        @RequestMapping("/loggedinusers")
        public String viewAllLoggedInUsers(Model model) {

            List<Object> principals = sessionRegistry.getAllPrincipals();

            model.addAttribute("size", principals.size());

            List<Integer> listOfUserIds = new ArrayList<Integer>();

            for (Object principal : principals) {
                if (principal instanceof Principal) {
                    listOfUserIds.add(((Principal) principal).getId());
                }
            }

            return "/logged_in_users";
        }

上記のコードは、セキュリティ構成を変更する前に機能していました。ここに私のすべての設定があります:

 <!-- bean namespave -->

        <security:global-method-security jsr250-annotations="enabled"  pre-post-annotations="enabled" secured-annotations="enabled" />

        <security:http use-expressions="true" entry-point-ref="loginEntryPoint">
            <security:intercept-url pattern="/login" access="permitAll()" />

            <!-- ******* Filters ******* -->
            <security:custom-filter ref="ipFormLoginFilter" position="FORM_LOGIN_FILTER"/>

            <security:logout 
                delete-cookies="JSESSIONID" 
                logout-url="/logout"
                logout-success-url="/login"
            />

            <security:session-management session-fixation-protection="newSession">                    
                <security:concurrency-control session-registry-alias="sessionRegistry" max-sessions="5"  error-if-maximum-exceeded="false" />
            </security:session-management>

        </security:http>

        <bean id="loginEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
            <constructor-arg value="/login"/>
        </bean>

        <security:authentication-manager alias="authenticationManager">
            <security:authentication-provider ref="customUserAuthenticationProvider" />
        </security:authentication-manager>

        <bean  id="ipFormLoginFilter" class="nl.irp.vadp.security.CustomIpUsernamePasswordAuthenticationFilter">
            <property name="filterProcessesUrl" value="/authlogin"/>
            <property name="authenticationManager" ref="authenticationManager"/>
            <property name="usernameParameter" value="username"/>
            <property name="passwordParameter" value="password"/>
            <property name="authenticationSuccessHandler">
                <bean class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
                    <property name="defaultTargetUrl" value="/"/>
                </bean>
            </property>
            <property name="authenticationFailureHandler">
                <bean class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
                    <property name="defaultFailureUrl" value="/login?login_error=true"/>
                </bean>
            </property>
        </bean>

        <bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder">
            <constructor-arg value="512" />
        </bean>

    </beans>

コード:: フィルタ クラス

    public final class CustomIpUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter {

        @Override
        public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
            if (request.getMethod().equals("POST")) {
                String username = obtainUsername(request);
                String password = obtainPassword(request);
                UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
                setDetails(request, authRequest);
                return this.getAuthenticationManager().authenticate(authRequest);
            }
            throw new AuthenticationServiceException("Authentication method not supported: "    + request.getMethod());
        }
    }

コード:: カスタム認証クラス

    @Component
    public class CustomUserAuthenticationProvider implements AuthenticationProvider {

        @Autowired
        UserService userService;
        @Autowired
        ShaPasswordEncoder shaPasswordEncoder;

        public CustomUserAuthenticationProvider() {
        }

        @Override
        public Authentication authenticate(Authentication authentication) throws AuthenticationException {
            final String BAD_CREDENTIALS = "test";
            final String BAD_IP_ADDRESS = "test";
            List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
            UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) authentication;

            String email = token.getName();

            User user = null;
            if (email != null) {
                user = userService.findUserByEmail(email);
            }
            if (user == null) {
                throw new UsernameNotFoundException(BAD_CREDENTIALS + "no user found");
            }

            String password = user.getPassword();
            String salt = user.getName();

            if (!shaPasswordEncoder.isPasswordValid(password, (String) token.getCredentials(), salt)) {
                throw new BadCredentialsException(BAD_CREDENTIALS + "bad password");
            }

            if (!user.hasIpaddress(request.getRemoteAddr())) {
                throw new BadCredentialsException(BAD_IP_ADDRESS + "bad ip adress");
            }

            authorities.add(new SimpleGrantedAuthority("ROLE_" + user.getRole().getName().toUpperCase()));
            Principal principal = new Principal(user.getEmail(), user.getPassword(), authorities, user.getId());

            return new UsernamePasswordAuthenticationToken(principal, user.getPassword());
        }

        @Override
        public boolean supports(Class<?> authentication) {
            return CustomIpUsernamePasswordAuthenticationToken.class.equals(authentication);
        }
    }

次のリスナーが追加されます。

<!--  Listeners -->
<listener><!-- Starts up the webapp project -->
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener><!-- spring security listener -->
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>
    <!-- extra toegevoegd voor die ip ... -->
<listener>
    <listener-class>
    org.springframework.web.context.request.RequestContextListener
    </listener-class>
</listener>

上記のコードが示すように、挿入されたデータを認証する認証メソッドを使用して独自の AuthenticationProvider を作成しました。これは完全に機能します (コンポーネントのスキャンも行われます)。jsp の権限 (たとえば) も機能するようです。登録されたプリンシパルを取得できない理由がわかりません。

編集: 追加情報を挿入する前に、タグから「auto-config=true」を削除しました。

誰かが私を助けてくれることを願っています。

EDIT 2: 問題がどこにあるかがわかりました。私自身のカスタム フィルターには、sessionAuthenticationStrategy というプロパティがあります。このフィールドは設定する必要があります。

フィルターに次を挿入しましたが、機能します。

<property name="sessionAuthenticationStrategy" ref="sessionFixationProtectionStrategy" />

<bean id="sessionFixationProtectionStrategy" class="org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy">

Gtrz、

4

0 に答える 0