【问题标题】:How to get a field from spring security?如何从spring security获得一个字段?
【发布时间】:2016-04-05 15:44:13
【问题描述】:

型号

@Column(name="id_usr_adm_tkn")
private int id;

@Column(name="npp_usr_adm_tkn")
private String npp;

@Column(name="jbtn_usr_adm_tkn")
private String jabatan;
@Id
@Column(name="username_usr_adm_tkn")
private String username;

@Column(name="password_usr_adm_tkn")
private String password;
//describes the tables in the database
@Column(name="email_usr_adm_tkn")
private String email;

@Column(name="nm_adm_usr_tkn")
private String nama;

@Column(name="ktk_adm_usr_tkn")
private String kontak;

@Column(name="sts")
private int sts;

@Column(name="id_wlyh")
private int id_wlyh;

spring-security.xml

<authentication-manager>
    <authentication-provider>
        <jdbc-user-service data-source-ref="dataSource"
            users-by-username-query="select username_usr_adm_tkn,password_usr_adm_tkn, sts from adm_tkn_tebel where username_usr_adm_tkn=?"
            authorities-by-username-query="select username, role from roles where username =?  " />
    </authentication-provider>
</authentication-manager>

我可以使用这样的步骤从 spring security 中检索用户名

 Authentication auth = SecurityContextHolder.getContext().getAuthentication();
                UserDetails userDetail = (UserDetails) auth.getPrincipal();
                String admin = userDetail.getUsername();

问题是我无法获取“id_wlyh”等其他字段?怎么办?

【问题讨论】:

    标签: spring spring-mvc spring-security


    【解决方案1】:

    您必须创建自己的身份验证提供程序

     <authentication-manager>
            <authentication-provider ref="myprovider" />
     </authentication-manager>
    

    该类将如下所示:

    @Component("myprovider")
    public class MyProvider extends AbstractUserDetailsAuthenticationProvider {
    
        @Autowired
        private UserDao userdao;
    
        @Override
        public void additionalAuthenticationChecks(final UserDetails arg0, final UsernamePasswordAuthenticationToken arg1) throws AuthenticationException {
            // Nothing
        }
    
        @Override
        protected UserDetails retrieveUser(final String username, final UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {
            MyUser u = userdao.getUser(username);
            if (u != null) {
                return u;
            }else{
                throw new BadCredentialsException("user invalid");
            }
        }
    
    }
    

    您必须创建您的用户类,添加任意数量的字段:

    public class MyUser extends org.springframework.security.core.userdetails.User {
    }
    

    然后在访问主体时,您可以将其转换为您自己的定义:

    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    MyUser userDetail = (MyUser) auth.getPrincipal();
    

    这样你就可以访问任何你想要的数据

    【讨论】:

    • 对不起,我不明白@Autowired private UserDao userdao;如果我必须做一个类 userDao ?请更详细地解释
    • 运行程序时出现此错误“没有定义名为'myprovider'的bean”
    • UserDao 是一个类,如果用户存在,您必须创建该类以签入数据库。如果找不到 bean myprovider,请确保它在您的 compentScan 中,否则在 xml 中声明 bean 而不是使用 @Component 注释:。在您的身份验证管理器中仅使用一个身份验证提供程序删除旧的
    • 我已经按照您的指示操作了,但是我收到了如上的错误,如果根据您的建议有不合适的?我很普通,我需要您的所有帮助
    • 看起来 spring 没有找到你的类,所以在你的 spring-security.xml 中声明:跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 2015-06-30
    • 2015-07-21
    相关资源
    最近更新 更多