abstractuserdetailsauthenticationprovider.java

来自「acegi构造安全的java系统」· Java 代码 · 共 320 行 · 第 1/2 页

JAVA
320
字号
        if (forcePrincipalAsString) {            principalToReturn = user.getUsername();        }        return createSuccessAuthentication(principalToReturn, authentication, user);    }    /**     * Creates a successful {@link Authentication} object.<p>Protected so subclasses can override.</p>     *  <p>Subclasses will usually store the original credentials the user supplied (not salted or encoded     * passwords) in the returned <code>Authentication</code> object.</p>     *     * @param principal that should be the principal in the returned object (defined by the {@link     *        #isForcePrincipalAsString()} method)     * @param authentication that was presented to the provider for validation     * @param user that was loaded by the implementation     *     * @return the successful authentication token     */    protected Authentication createSuccessAuthentication(Object principal, Authentication authentication,        UserDetails user) {        // Ensure we return the original credentials the user supplied,        // so subsequent attempts are successful even with encoded passwords.        // Also ensure we return the original getDetails(), so that future        // authentication events after cache expiry contain the details        UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(principal,                authentication.getCredentials(), user.getAuthorities());        result.setDetails(authentication.getDetails());        return result;    }    protected void doAfterPropertiesSet() throws Exception {}    public UserCache getUserCache() {        return userCache;    }    public boolean isForcePrincipalAsString() {        return forcePrincipalAsString;    }    public boolean isHideUserNotFoundExceptions() {        return hideUserNotFoundExceptions;    }    /**     * Allows subclasses to actually retrieve the <code>UserDetails</code> from an implementation-specific     * location, with the option of throwing an <code>AuthenticationException</code> immediately if the presented     * credentials are incorrect (this is especially useful if it is necessary to bind to a resource as the user in     * order to obtain or generate a <code>UserDetails</code>).<p>Subclasses are not required to perform any     * caching, as the <code>AbstractUserDetailsAuthenticationProvider</code> will by default cache the     * <code>UserDetails</code>. The caching of <code>UserDetails</code> does present additional complexity as this     * means subsequent requests that rely on the cache will need to still have their credentials validated, even if     * the correctness of credentials was assured by subclasses adopting a binding-based strategy in this method.     * Accordingly it is important that subclasses either disable caching (if they want to ensure that this method is     * the only method that is capable of authenticating a request, as no <code>UserDetails</code> will ever be     * cached) or ensure subclasses implement {@link #additionalAuthenticationChecks(UserDetails,     * UsernamePasswordAuthenticationToken)} to compare the credentials of a cached <code>UserDetails</code> with     * subsequent authentication requests.</p>     *  <p>Most of the time subclasses will not perform credentials inspection in this method, instead     * performing it in {@link #additionalAuthenticationChecks(UserDetails, UsernamePasswordAuthenticationToken)} so     * that code related to credentials validation need not be duplicated across two methods.</p>     *     * @param username The username to retrieve     * @param authentication The authentication request, which subclasses <em>may</em> need to perform a binding-based     *        retrieval of the <code>UserDetails</code>     *     * @return the user information (never <code>null</code> - instead an exception should the thrown)     *     * @throws AuthenticationException if the credentials could not be validated (generally a     *         <code>BadCredentialsException</code>, an <code>AuthenticationServiceException</code> or     *         <code>UsernameNotFoundException</code>)     */    protected abstract UserDetails retrieveUser(String username, UsernamePasswordAuthenticationToken authentication)        throws AuthenticationException;    public void setForcePrincipalAsString(boolean forcePrincipalAsString) {        this.forcePrincipalAsString = forcePrincipalAsString;    }    /**     * By default the <code>AbstractUserDetailsAuthenticationProvider</code> throws a     * <code>BadCredentialsException</code> if a username is not found or the password is incorrect. Setting this     * property to <code>false</code> will cause <code>UsernameNotFoundException</code>s to be thrown instead for the     * former. Note this is considered less secure than throwing <code>BadCredentialsException</code> for both     * exceptions.     *     * @param hideUserNotFoundExceptions set to <code>false</code> if you wish <code>UsernameNotFoundException</code>s     *        to be thrown instead of the non-specific <code>BadCredentialsException</code> (defaults to     *        <code>true</code>)     */    public void setHideUserNotFoundExceptions(boolean hideUserNotFoundExceptions) {        this.hideUserNotFoundExceptions = hideUserNotFoundExceptions;    }    public void setMessageSource(MessageSource messageSource) {        this.messages = new MessageSourceAccessor(messageSource);    }    public void setUserCache(UserCache userCache) {        this.userCache = userCache;    }    protected UserDetailsChecker getPreAuthenticationChecks() {        return preAuthenticationChecks;    }    /**     * Sets the policy will be used to verify the status of the loaded <tt>UserDetails</tt> <em>before</em>     * validation of the credentials takes place.     *     * @param preAuthenticationChecks strategy to be invoked prior to authentication.      */    public void setPreAuthenticationChecks(UserDetailsChecker preAuthenticationChecks) {        this.preAuthenticationChecks = preAuthenticationChecks;    }    protected UserDetailsChecker getPostAuthenticationChecks() {        return postAuthenticationChecks;    }    public void setPostAuthenticationChecks(UserDetailsChecker postAuthenticationChecks) {        this.postAuthenticationChecks = postAuthenticationChecks;    }        public boolean supports(Class authentication) {        return (UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication));    }    private class DefaultPreAuthenticationChecks implements UserDetailsChecker {        public void check(UserDetails user) {            if (!user.isAccountNonLocked()) {                throw new LockedException(messages.getMessage("AbstractUserDetailsAuthenticationProvider.locked",                        "User account is locked"), user);            }            if (!user.isEnabled()) {                throw new DisabledException(messages.getMessage("AbstractUserDetailsAuthenticationProvider.disabled",                        "User is disabled"), user);            }            if (!user.isAccountNonExpired()) {                throw new AccountExpiredException(messages.getMessage("AbstractUserDetailsAuthenticationProvider.expired",                        "User account has expired"), user);            }        }    }    private class DefaultPostAuthenticationChecks implements UserDetailsChecker {        public void check(UserDetails user) {            if (!user.isCredentialsNonExpired()) {                throw new CredentialsExpiredException(messages.getMessage(                        "AbstractUserDetailsAuthenticationProvider.credentialsExpired",                        "User credentials have expired"), user);            }        }    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?