Dean Holden's City – who have not beaten Preston home or away in almost a decade – slid to a third defeat on the spin and a fourth in five games as they blew their chance to move into the play-off places.
A second straight home win for Alex Neil's side, meanwhile, helps ease the disappointment of back-to-back away defeats in the past week.
The game was almost 20 minutes old before the hosts created the first opportunity, Sean Maguire neatly playing in the advancing Scott Sinclair only for his well-struck angled effort to take a slight deflection before drifting wide.
But the hosts struck from the spot in the 21st minute, Sinclair having been tripped by Taylor Moore after he made a purposeful run into the City box and Johnson beating Bentley with a comfortable finish.
City continued their probing as the half-hour mark passed, but still they failed to test North End goalkeeper Declan Rudd.
At the other end Maguire pounced on a slip by Jack Hunt before eventually seeing his low drive smartly blocked by Moore.
The game was now flowing from end to end and City went close for the first time in the 36th minute. A Han-Noah Massengo free-kick was met at the back post by City skipper Tomas Kalas only for his goal-bound volley to be blocked by Paul Gallagher.
In first-half stoppage time Preston threatened again as midfielder Tom Barkhuizen darted expertly down the right flank before crossing in for Sinclair, but his well-guided volley from eight yards was gathered comfortably by a grateful Bentley.
The visitors carved out the first chance of the second period as Antoine Semenyo – on as a substitute at the interval – stooped to get a head to Jack Hunt's cross, but his effort was straight at Rudd.
Semenyo was alert again a couple of minutes later, but this time his powerful shot was deflected behind for a corner.
City pressed for a leveller and Tommy Rowe curled in a 20-yard strike which a diving Rudd palmed away in breathtaking style.
And the Robins remained well on top as the final 20 minutes approached, sub Tyreeq Bakinson lashing in a shot which flew harmlessly off target.
Semenyo went close again in the 78th minute when he flicked Hunt's cross just past the upright from close in.
And Rowe's bullet header was expertly saved by the impressive Rudd late on as the hosts held on for all three points.