· 9 years ago · Sep 21, 2017, 06:22 AM
1@Autowired
2public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {
3 auth.jdbcAuthentication().dataSource(dataSource)
4 .usersByUsernameQuery(
5 "select username,password, enabled from users where username=?")
6 .authoritiesByUsernameQuery(
7 "select username, role from user_roles where username=?");
8}
9
10CREATE TABLE IF NOT EXISTS users (
11 id SERIAL PRIMARY KEY,
12 username VARCHAR(20) UNIQUE NOT NULL,
13 password VARCHAR(20) UNIQUE NOT NULL,
14 role INTEGER NOT NULL,
15 FOREIGN KEY (role) REFERENCES user_role (id)
16);
17
18CREATE TABLE IF NOT EXISTS user_role (
19 id SERIAL PRIMARY KEY,
20 role VARCHAR(10)
21);
22
23select u.username, r.role from users
24inner join user_role on u.role = r.id
25where username = ?
26
27<security:authentication-manager>
28 <security:authentication-provider>
29 <security:jdbc-user-service
30 data-source-ref="dataSource"
31 users-by-username-query="select username, password, enabled from users where username = ?"
32 authorities-by-username-query="select m2m.username, a.authority from group_members as m2m inner join group_authorities as a using(group_id) where m2m.username = ?" />
33 </security:authentication-provider>
34</security:authentication-manager>
35
36@Service("userDetailsService")
37public class MyUserDetailsService extends JdbcDaoImpl {
38 private final String usersByUsernameQuery
39 = "select login, password, enabled, superuser from users where login = ?";
40 private final String authoritiesByUsernameQuery
41 = "select u.login, a.authority_name from groups_users as m2m "
42 + "inner join users as u on u.id = m2m.members_id "
43 + "inner join groups as g on g.id = m2m.groups_id "
44 + "where u.login = ?";
45
46 ...
47
48 public MyUserDetails loadUserByUsernameAndRealm(String username) {
49 List<MyUserDetails> users = loadUsersByUsername(username);
50 if (users.size() == 0) {
51 throw new UsernameNotFoundException("Username not found");
52 }
53 MyUserDetails user = users.get(0);
54
55 List<GrantedAuthority> authorities = loadAuthorities(user.getUsername());
56
57 return createUserDetails(username, user, authorities);
58 }
59
60 protected List<MyUserDetails> loadUsersByUsername(String username) {
61 return getJdbcTemplate().query(usersByUsernameQuery, new String[] { username },
62 new RowMapper<UserDetails>() {
63 public UserDetails mapRow(ResultSet rs, int rowNum) throws SQLException {
64 String username = rs.getString(1);
65 String password = rs.getString(2);
66 boolean enabled = rs.getBoolean(3);
67 boolean superuser = rs.getBoolean(4); // Ðовое ÑвойÑтво!
68 boolean accountNonExpired = true;
69 boolean credentialsNonExpired = true;
70 boolean accountNonLocked = true;
71
72 return new MyUser(username, password, enabled, superuser, accountNonExpired, credentialsNonExpired,
73 accountNonLocked, AuthorityUtils.NO_AUTHORITIES);
74 }
75 }
76 );
77 }
78}
79
80public class MyUser extends User {
81 private final boolean superuser;
82
83 public MyUser(String username, String password, boolean enabled,
84 boolean superuser, boolean accountNonExpired,
85 boolean credentialsNonExpired, boolean accountNonLocked,
86 List<GrantedAuthority> authorities) {
87 super(username, password, enabled, accountNonExpired,
88 credentialsNonExpired, accountNonLocked, authorities);
89 this.superuser = superuser;
90 }
91
92 public boolean isSuperuser() {
93 return superuser;
94 }
95}