0

このトピックは、以前のトピック「認証されたユーザーエンティティの取得」Spring MVCから作成しました。ここで、認証されたユーザーエンティティを適切に取得することについて質問しました。UserDetailsS​​erviceの構成が正しければ、プリンシパルオブジェクト(たとえば、ビュー上<sec:authentication property="principal.customFieldName" />)がカスタムフィールドにアクセスできることをアドバイスしました。UserDetailsS​​erviceは、この機能を実現するために適切に構成されていますか?

@Service("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {
    private static final Logger logger = Logger.getLogger(UserDetailsServiceImpl.class);

    @Autowired
    @Qualifier("hibernateUserDao")
    private UserDAO userDAO;

    @Override
    @Transactional(readOnly = true)
    public org.springframework.security.core.userdetails.UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException, DataAccessException {
        UserDetails user = userDAO.findByLogin(userName);

        if (user == null) {
            logger.error("User was not found! Input login: " + userName);
        }

        return buildUserFormUserEntity(user);
    }

    @Transactional(readOnly = true)
    private org.springframework.security.core.userdetails.User buildUserFormUserEntity(UserDetails userDetails) {
        boolean enableStatus = userDetails.isEnabled();
        String userName = userDetails.getLogin();
        String password = userDetails.getPassword();
        boolean enabled = enableStatus;
        boolean accountNonExpired = enableStatus;
        boolean credentialsNonExpired = enableStatus;
        boolean accountNonLocked = enableStatus;

        Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
        authorities.add(new SimpleGrantedAuthority(userDetails.getRole()));

        User springSecurityUser = new User(userName, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
        return springSecurityUser;
    }

    public UserDAO getUserDAO() {
        return userDAO;
    }

    public void setUserDAO(UserDAO userDAO) {
        this.userDAO = userDAO;
    }
}
4

1 に答える 1

1

正常に使用できるようにするには、いくつかの追加の手順が必要だと思います

<sec:authentication property="principal.customFieldName" />

いくつかのページで:

  1. インターフェイスを実装するカスタム ユーザー オブジェクトを追加しますorg.springframework.security.core.userdetails.UserDetails。これを行う最も簡単な方法は、既存のorg.springframework.security.core.userdetails.Userクラスを拡張することです。class CutomUser extends User
  2. customFieldNameプロパティをCutomUserクラスに追加します。
  3. CutomUserメソッドの戻り値の型として使用しますUserDetailsServiceImpl.loadUserByUsername(...)customFieldNameこの時点で埋めることを忘れないでください。
于 2013-03-06T09:44:00.093 に答える