代码之家  ›  专栏  ›  技术社区  ›  tzim

Spring安全错误记录用户

  •  2
  • tzim  · 技术社区  · 16 年前

    我使用SpringMVC[版本:2.5]和Security[版本:2.0.4]。

    我的问题是:

    首先使用usera登录名和密码登录我的应用程序->确定

    注销usera,userb登录。

    userb登录+密码工作正常,我在app中,userb角色打开。[如果他不是管理员,则无法访问管理会话]

    然而!

    我使用此代码从数据库获取有关登录用户的数据: userejb.findUserByUsername(SecurityContextHolder.getContext().getAuthentication().getName());

    我的用户不是userb而是usera…

    我怎么修?我做错了什么?

    我的安全配置:

    <bean id="userDetailsService" class="pl.tzim.jlp.security.CustomUserDetailsServiceImpl" />
    <http auto-config='true'>
        <!-- login panel dostepny dla wszystkich chetnych!-->
        <intercept-url pattern="/login.action" filters="none"/>
        <intercept-url pattern="/index.jsp" filters="none"/>
        <intercept-url pattern="/CS/**" filters="none" />
        <intercept-url pattern="/JS/**" filters="none" />
        <intercept-url pattern="/grafiki/**" filters="none" />
        <intercept-url pattern="/free/**" access="" />
        <intercept-url pattern="/admin/**" access="ROLE_ADMIN"/>
        <intercept-url pattern="/teacher/**" access="ROLE_TEACHER, ROLE_ADMIN"/>
        <intercept-url pattern="/all/**" access="ROLE_STUDENT, ROLE_TEACHER, ROLE_ADMIN"/>
        <intercept-url pattern="/student/**" access="ROLE_STUDENT, ROLE_TEACHER, ROLE_ADMIN"/>
        <intercept-url pattern="/login/**" access="ROLE_STUDENT, ROLE_TEACHER, ROLE_ADMIN" />
        <intercept-url pattern="/*" access="ROLE_STUDENT, ROLE_TEACHER, ROLE_ADMIN" />
        <form-login login-page='/free/login.action' authentication-failure-url="/free/login.action?why=error" default-target-url="/free/index.action"/>
        <logout logout-success-url="/free/login.action?why=logout"/>
        <concurrent-session-control max-sessions="99" exception-if-maximum-exceeded="true"/>
    </http>    
    <authentication-provider user-service-ref='userDetailsService' />
    

    我的LoginUser类和方法:

    @SessionAttributes(types = {CustomUser.class}, value = "{logedUser}")
    public class CustomUserDetailsServiceImpl implements UserDetailsService {
        @Autowired
        public UserDAO userdao;
        public CustomUser logedUser; 
        @Transactional(readOnly = true)
        @Override
        public CustomUser loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
            try {
                pl.tzim.jlp.model.user.User user = this.userdao.findUserByUsername(username);
                String password = user.getPassword();
                String role = user.getAuthority().getRolename();
                boolean enabled = true;
                logedUser = new CustomUser(user.getId(), username, password, enabled, new GrantedAuthority[]{new GrantedAuthorityImpl(role)});
                return logedUser; 
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    }
    
    public class CustomUser extends User{
        private Long id;
        public CustomUser(Long id, String username, String password, boolean isEnabled, GrantedAuthority[] authorities){
            super(username, password, isEnabled, true, true, true, authorities);
            this.setId(id);
        }
        public Long getId() {
            return id;
        }
        public void setId(Long id) {
            this.id = id;
        }
    }
    
    2 回复  |  直到 9 年前
        1
  •  1
  •   Stephen C    16 年前

    我建议您将日志级别设置为调试并检查日志以查看发生了什么。

        2
  •  0
  •   rodrigoap    16 年前

    为什么要保留此属性中的最后一个用户?

    public CustomUser logedUser;
    

    看起来每次登录都会覆盖它。 为什么把它放进 会议 当Spring Security已经将其存储在 安全上下文所有者 .

    正如斯蒂芬所说,我们需要日志输出。